为什么我无法向 Android Activity 构造函数传递参数

问题描述 投票:0回答:5

我知道我无法将参数传递给android中的Activity构造函数,但我想了解为什么。

我尝试做的是:

CalorieSelectorActivity csa = new CalorieSelectorActivity(userName);
                Intent i = new Intent(thisContext, csa.getClass());
                startActivity(i);

我将类定义如下:

public class CalorieSelectorActivity extends Activity {

public CalorieSelectorActivity(String name) {
    super();

}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.calorieselector);

}
}

当我从构造函数中删除参数时,它工作得很好。 我终于使用intent.putExtra做到了,但我很好奇为什么不能通过向构造函数传递参数来完成?

日志猫

02-04 06:46:52.257: W/dalvikvm(800): threadid=1: thread exiting with uncaught exception (group=0x4001d800)
02-04 06:46:52.277: E/AndroidRuntime(800): FATAL EXCEPTION: main
02-04 06:46:52.277: E/AndroidRuntime(800): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.manarbushnaq.calorietracker/com.manarbushnaq.calorietracker.CalorieSelectorActivity}: java.lang.InstantiationException: com.manarbushnaq.calorietracker.CalorieSelectorActivity
02-04 06:46:52.277: E/AndroidRuntime(800):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2585)
02-04 06:46:52.277: E/AndroidRuntime(800):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
02-04 06:46:52.277: E/AndroidRuntime(800):  at android.app.ActivityThread.access$2300(ActivityThread.java:125)
02-04 06:46:52.277: E/AndroidRuntime(800):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
02-04 06:46:52.277: E/AndroidRuntime(800):  at android.os.Handler.dispatchMessage(Handler.java:99)
02-04 06:46:52.277: E/AndroidRuntime(800):  at android.os.Looper.loop(Looper.java:123)
02-04 06:46:52.277: E/AndroidRuntime(800):  at android.app.ActivityThread.main(ActivityThread.java:4627)
02-04 06:46:52.277: E/AndroidRuntime(800):  at java.lang.reflect.Method.invokeNative(Native Method)
02-04 06:46:52.277: E/AndroidRuntime(800):  at java.lang.reflect.Method.invoke(Method.java:521)
02-04 06:46:52.277: E/AndroidRuntime(800):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
02-04 06:46:52.277: E/AndroidRuntime(800):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
02-04 06:46:52.277: E/AndroidRuntime(800):  at dalvik.system.NativeStart.main(Native Method)
02-04 06:46:52.277: E/AndroidRuntime(800): Caused by: java.lang.InstantiationException: com.manarbushnaq.calorietracker.CalorieSelectorActivity
02-04 06:46:52.277: E/AndroidRuntime(800):  at java.lang.Class.newInstanceImpl(Native Method)
02-04 06:46:52.277: E/AndroidRuntime(800):  at java.lang.Class.newInstance(Class.java:1429)
02-04 06:46:52.277: E/AndroidRuntime(800):  at android.app.Instrumentation.newActivity(Instrumentation.java:1021)
02-04 06:46:52.277: E/AndroidRuntime(800):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2577)
02-04 06:46:52.277: E/AndroidRuntime(800):  ... 11 more
android constructor android-activity
5个回答
27
投票

参考您的代码:

CalorieSelectorActivity csa = new CalorieSelectorActivity(userName);

Intent i = new Intent(thisContext, csa.getClass());

startActivity(i);

即使您创建了 Activity 的对象,您在 Intent 对象中“传递”的也不是

Activity
object,而只是 Activity 的 class。在
startActivity()
中,Android 框架将尝试实例化您的 Activity 的对象。当它执行此操作时,它会调用默认构造函数(不带参数)。当您的类没有不带参数的构造函数时,它会失败。

当然,您已经找到了正确的解决方案,将参数作为 Intent 对象的一部分传递。


7
投票

我很惊讶没有人回答实际提出的问题! 所以回答这个问题

Why I cannot pass parameters to Android Activity Constructor
:因为Android调用Activity的构造函数,而Android调用的唯一构造函数是默认构造函数,当然你可以重写它,但是“添加与否并不重要,并且没有任何上下文可以以有用的方式使用它。”。

因此,由于您无法将参数传递给默认构造函数,因此您无法使用它来为您工作。


1
投票

如果您确实需要创建一个具有构造函数的

Activity
(因为,比如说,您正在创建一个将由另一个应用程序启动的
Activity
,例如 Tasker 插件的编辑活动),您可以可以通过使用派生类来做到这一点,如下所示:

class BaseActivity extends Activity
{
    public BaseActivity(String parameter)
    {
        // Do something with parameter
    }
}

class DerivedActivity extends BaseActivity
{
    public DerivedActivity()
    {
        super("parameter");
    }
}

如果需要生成参数,请将

"parameter"
替换为返回适当值的函数调用。


1
投票

尝试使用额外功能在活动之间传递值:

Intent intent = new Intent(getBaseContext(), CalorieSelectorActivity.class);
intent.putExtra("username", userName);
startActivity(intent);

在 onCreate 方法中访问下一个活动的意图:

String userName = getIntent().getStringExtra("username");

另一种选择是使用静态变量,但我不知道这是否是一个好的做法。


-1
投票

当您尝试调用构造函数时会出现什么错误?您可以通过调用其构造将值传递到 Activity 的新实例中。它可能会也可能不会解决你的问题,但是如果你用@override注释你的构造函数会发生什么?

也就是说,您确实应该使用 Bundle 或intent.put 方法来使数据可用,因为如果您的 Activity 暂停以释放内存,系统可以恢复这些值。

© www.soinside.com 2019 - 2024. All rights reserved.