我知道我无法将参数传递给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
参考您的代码:
CalorieSelectorActivity csa = new CalorieSelectorActivity(userName);
Intent i = new Intent(thisContext, csa.getClass());
startActivity(i);
即使您创建了 Activity 的对象,您在 Intent 对象中“传递”的也不是
Activity
object,而只是 Activity 的 class。在 startActivity()
中,Android 框架将尝试实例化您的 Activity 的对象。当它执行此操作时,它会调用默认构造函数(不带参数)。当您的类没有不带参数的构造函数时,它会失败。
当然,您已经找到了正确的解决方案,将参数作为 Intent 对象的一部分传递。
我很惊讶没有人回答实际提出的问题! 所以回答这个问题
Why I cannot pass parameters to Android Activity Constructor
:因为Android调用Activity的构造函数,而Android调用的唯一构造函数是默认构造函数,当然你可以重写它,但是“添加与否并不重要,并且没有任何上下文可以以有用的方式使用它。”。
因此,由于您无法将参数传递给默认构造函数,因此您无法使用它来为您工作。
如果您确实需要创建一个具有构造函数的
Activity
(因为,比如说,您正在创建一个将由另一个应用程序启动的 Activity
,例如 Tasker 插件的编辑活动),您可以可以通过使用派生类来做到这一点,如下所示:
class BaseActivity extends Activity
{
public BaseActivity(String parameter)
{
// Do something with parameter
}
}
class DerivedActivity extends BaseActivity
{
public DerivedActivity()
{
super("parameter");
}
}
如果需要生成参数,请将
"parameter"
替换为返回适当值的函数调用。
尝试使用额外功能在活动之间传递值:
Intent intent = new Intent(getBaseContext(), CalorieSelectorActivity.class);
intent.putExtra("username", userName);
startActivity(intent);
在 onCreate 方法中访问下一个活动的意图:
String userName = getIntent().getStringExtra("username");
另一种选择是使用静态变量,但我不知道这是否是一个好的做法。
当您尝试调用构造函数时会出现什么错误?您可以通过调用其构造将值传递到 Activity 的新实例中。它可能会也可能不会解决你的问题,但是如果你用@override注释你的构造函数会发生什么?
也就是说,您确实应该使用 Bundle 或intent.put 方法来使数据可用,因为如果您的 Activity 暂停以释放内存,系统可以恢复这些值。