为什么我不能将参数传递给Android Activity构造函数 [英] Why I cannot pass parameters to Android Activity Constructor

查看:523
本文介绍了为什么我不能将参数传递给Android Activity构造函数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我知道我无法将参数传递给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,但是很好奇为什么它不能通过传递参数到构造函数?



LogCat

  02-04 06:46:52.257:W / dalvikvm(800):threadid = 1:thread退出与未捕获的异常(组= 0x4001d800)
02-04 06:46:52.277:E / AndroidRuntime(800):致命例外:主
02-04 06:46:52.277:E / AndroidRuntime 800):java.lang.RuntimeException:无法实例化活动ComponentInfo {com.manarbushnaq.calorietracker.CalorieSelectorActivity}:java.lang.InstantiationException:com.manarbushnaq.calorietracker.CalorieSelectorActivity
02-04 06:46:52.277:E / AndroidRuntime(800):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2585)
02-04 06:46:52.277:E / AndroidRuntime .app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
02-04 06:46:52.277:E / AndroidRuntime(800):在android.app.ActivityThread.access $ 2300(ActivityThread.java:125)
02-04 06:46:52.277:E / AndroidRuntime(800):在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:2033)
02-04 06:46:52.277:E / AndroidRuntime(800):在android.os.Handler.dispatchMessage(Handler.java:99)
02-04 06:46:52.277:E / AndroidRuntime(800):在android.os.Looper.loop Looper.java:123)
02-04 06:46:52.277:E / AndroidRuntime(800):在android.app.ActivityThread.main(ActivityThread.java:4627)
02-04 06: 46:52.277:E / AndroidRuntime(800):at java.lang.reflect.Method.invokeNative(本地方法)
02-04 06:46:52.277:E / AndroidRuntime(800):在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):在dalvik.system.NativeStart.main(本地方法)
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方法)
02-04 06 :46:52.277:E / AndroidRuntime(800):在java.lang.Class.newInstance(Class.java:1429)
02-04 06:46:52.277:E / AndroidRuntime app.Instrumentation.newActivity(Instrumentation.java:1021)
02-04 06:46:52.277:E / AndroidRuntime(800):在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);

即使您创建了一个活动对象,您在Intent对象中传递的是不是活动对象,而只是您的活动的。在 startActivity()中,Android框架将尝试实例化您的活动的对象。并且它调用默认构造函数(没有参数)。当你的类没有没有参数的构造函数时,它失败。



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

I know that I cannot pass parameters to the Activity constructor in android, but I would like to understand why.

What I tried to do is:

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

I have defined the class as follows:

public class CalorieSelectorActivity extends Activity {

public CalorieSelectorActivity(String name) {
    super();

}

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

}
}

And it works perfectly when I remove the parameters from the constructor. I finally did it using intent.putExtra, but am very curious to know why it cannot be done by passing parameters to the constructor?

LogCat:

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

解决方案

Refer to your code:

CalorieSelectorActivity csa = new CalorieSelectorActivity(userName);

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

startActivity(i);

Even if you create an object of your activity, what you are "passing" in the Intent object is not the activity object but just the class of your activity. In startActivity() the Android framework will try to instantiate an object of your activity. And it calls the default constructor (without parameters) when it does that. It fails when your class does not have a constructor without parameters.

Of course, you have found the correct solution, pass the parameters as part of Intent object.

这篇关于为什么我不能将参数传递给Android Activity构造函数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆