我正在开发一款Android应用。在我的应用程序中,我将意图转移到另一个类。一旦发生这种情况,应用程序就会崩溃。它说它无法实例化我的课程。我的代码如下:
public class CustomObject extends Activity{
ArrayList<String> Alerts;
ArrayList<String> Names;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = getIntent();
Names = intent.getExtras().getStringArrayList("Names");
Alerts = intent.getExtras().getStringArrayList("Alerts");
}
public CustomObject(ArrayList<String> prop1, ArrayList<String> prop2) {
this.Names = prop1;
this.Alerts = prop2;
}
public ArrayList<String> getProp1() {
return Names;
}
public ArrayList<String> getProp2() {
return Alerts;
}
}
这是我的LogCat:
10-24 19:56:25.234: E/AndroidRuntime(12982): FATAL EXCEPTION: main
10-24 19:56:25.234: E/AndroidRuntime(12982): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.dev.chicagotraintracker/com.dev.chicagotraintracker.CustomObject}: java.lang.InstantiationException: can't instantiate class com.dev.chicagotraintracker.CustomObject; no empty constructor
10-24 19:56:25.234: E/AndroidRuntime(12982): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2137)
10-24 19:56:25.234: E/AndroidRuntime(12982): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261)
10-24 19:56:25.234: E/AndroidRuntime(12982): at android.app.ActivityThread.access$600(ActivityThread.java:141)
10-24 19:56:25.234: E/AndroidRuntime(12982): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
10-24 19:56:25.234: E/AndroidRuntime(12982): at android.os.Handler.dispatchMessage(Handler.java:99)
10-24 19:56:25.234: E/AndroidRuntime(12982): at android.os.Looper.loop(Looper.java:137)
10-24 19:56:25.234: E/AndroidRuntime(12982): at android.app.ActivityThread.main(ActivityThread.java:5103)
10-24 19:56:25.234: E/AndroidRuntime(12982): at java.lang.reflect.Method.invokeNative(Native Method)
10-24 19:56:25.234: E/AndroidRuntime(12982): at java.lang.reflect.Method.invoke(Method.java:525)
10-24 19:56:25.234: E/AndroidRuntime(12982): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
10-24 19:56:25.234: E/AndroidRuntime(12982): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
10-24 19:56:25.234: E/AndroidRuntime(12982): at dalvik.system.NativeStart.main(Native Method)
10-24 19:56:25.234: E/AndroidRuntime(12982): Caused by: java.lang.InstantiationException: can't instantiate class com.dev.chicagotraintracker.CustomObject; no empty constructor
10-24 19:56:25.234: E/AndroidRuntime(12982): at java.lang.Class.newInstanceImpl(Native Method)
10-24 19:56:25.234: E/AndroidRuntime(12982): at java.lang.Class.newInstance(Class.java:1130)
10-24 19:56:25.234: E/AndroidRuntime(12982): at android.app.Instrumentation.newActivity(Instrumentation.java:1061)
10-24 19:56:25.234: E/AndroidRuntime(12982): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2128)
10-24 19:56:25.234: E/AndroidRuntime(12982): ... 11 more
我在代码中找不到问题。其他一些问题已经提到了一些关于无参数构造函数的问题,但是我该如何实现呢?这甚至是我的问题吗?谢谢你的帮助。
答案 0 :(得分:1)
活动和碎片可能具有带参数(a.k.a.参数)的构造函数,如下所示:
public CustomObject(ArrayList<String> prop1, ArrayList<String> prop2) {
this.Names = prop1;
this.Alerts = prop2;
}
只允许没有参数的构造函数public CustomObject() {
(根本不需要指定构造函数)
您必须使用String数组在Intent
中传递该信息。请参阅putExtra和getStringArrayExtra
要从其他活动创建此意图,您可以使用
Intent intent = new Intent(this, CustomObject.class);
intent.putExtra("prop1", arrayList.toArray(new String[arrayList.size()]));
intent.putExtra("prop2", arrayList2.toArray(new String[arrayList2.size()]));
startActivity(intent);
然后在您的Activity的onCreate
方法中,您可以使用以下方法检索值:
Intent intent = getIntent();
List<String> list1 = new ArrayList<String>(Arrays.asList(intent.getStringArrayExtra("prop1")));
List<String> list2 = new ArrayList<String>(Arrays.asList(intent.getStringArrayExtra("prop2")));
因为不可能轻易地发送List
一个意图,所以在这里它被转换为一个String数组,然后转回到onCreate方法中的List。
答案 1 :(得分:0)
继承Activity
类或Fragment
必须 的类具有空构造函数。做一些阅读。
在您目前的情况下,您可能会尝试通过保留此有争议的构造函数并调用super()
来解决它,请注意:这是空的超类构造函数调用。
我不喜欢这种做法。 Simon通过意图发送的解决方案是正确的方法。
答案 2 :(得分:0)
Activity需要一个非参数构造函数。现在,你添加了一个带有两个参数的构造函数。所以,你还应该添加一个非构造函数:
public CustomObject(){
}