以 Activity 名称作为变量启动 Activity

Posted

技术标签:

【中文标题】以 Activity 名称作为变量启动 Activity【英文标题】:Start an Activity with Activity name as a variable 【发布时间】:2017-06-14 23:49:32 【问题描述】:

我正在尝试从小吃店开始一项活动,并将字符串作为活动名称。

小吃店代码是:

private void showSnackbar(View view, String massgae, String action, final String intent) 
    Snackbar.make(view, massgae, Snackbar.LENGTH_LONG)
            .setAction(action, new View.OnClickListener() 
                @Override
                public void onClick(View v) 
                    Intent myIntent = null;
                    try 
                        myIntent = new Intent(context, Class.forName(intent));
                     catch (ClassNotFoundException e) 
                        e.printStackTrace();
                    
                    startActivity(myIntent);
                
            )
            .setActionTextColor(Color.WHITE)
            .setDuration(5000)
            .show();

我用这个来称呼它:

showSnackbar(llMain, getResources().getString(R.string.sbUserNotFound), getResources().getString(R.string.sbRegister), "Register.class");

当它加载时我得到:

java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“java.lang.String android.content.Intent.toString()”。

有什么帮助吗?

【问题讨论】:

【参考方案1】:

首先,这是个坏主意。不好意思说。 Class.forName() 不应该这样使用。

如果您想自定义启动哪个活动,请发送一个变量,例如 Class 并使其成为通用变量。

但是如果你真的坚持这个实现,那么它失败的原因是你必须将完整的包名传递给 Class.forName(),而不是在它的末尾添加“.class”。

比如:

Class.forName("com.testapp.ui.Register");

当然,您需要更改包名称以适合您自己的应用程序。

【讨论】:

我对 android 开发相当陌生,ide 建议使用 Class.forname。有更好的解决方案吗? @NirGolan 与其传入字符串意图,不如传入一个 Class 变量并将其直接传递给 Intent 构造函数。 谢谢。我又把你的答案弄红了,明白了。而不是字符串意图一个类意图。它现在工作。谢谢

以上是关于以 Activity 名称作为变量启动 Activity的主要内容,如果未能解决你的问题,请参考以下文章

Android查缺补漏--Activity生命周期和启动模式

Activity的启动模式与flag详解

Android基础知识-1

Android 启动过程Activity 启动源码分析 ( AMS -> ActivityThreadAMS 线程阶段 二 )

android 2018 面试题

Google 官方详解 Activity项目实例不容错过!