嗨我正在学习android编程。在这段代码中我试图将人物对象从一个活动发送到另一个。当我在我的设备上运行这个程序时它不运行而且不幸的是app已停止错误显示请给出一些解决方案对于这个问题。
1.主要活动
public class MainActivity extends Activity {
EditText editname;
EditText editage;
EditText editdob;
Person p1;
Button sw;
Intent intent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
editname=(EditText) findViewById(R.id.textname);
editage=(EditText) findViewById(R.id.editage);
editdob=(EditText) findViewById(R.id.editdob);
sw=(Button) findViewById(R.id.sw);
intent=new Intent(this,Second.class);
sw.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
p1.setAge(editage.getText().toString());
p1.setName(editname.getText().toString());
p1.setDob(editdob.getText().toString());
}
});
intent.putExtra("data", p1);
startActivity(intent);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
2.Person对象
public class Person implements Parcelable {
String name;
String age;
String dob;
Person(Parcel in)
{
readfromparcel(in);
}
private void readfromparcel(Parcel in) {
name =in.readString();
age=in.readString();
dob=in.readString();
}
@Override
public int describeContents() {
// TODO Auto-generated method stub
return 0;
}
Parcelable.Creator CREATOR =new Parcelable.Creator() {
@Override
public Object createFromParcel(Parcel source) {
return new Person(source);
}
@Override
public Object[] newArray(int size) {
// TODO Auto-generated method stub
return new Person[size];
}
};
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(age);
dest.writeString(name);
dest.writeString(name);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getDob() {
return dob;
}
public void setDob(String dob) {
this.dob = dob;
}
}
3.第二次活动
public class Second extends Activity {
Intent intent;
TextView textname,textage,textdob;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
textname=(TextView) findViewById(R.id.textname);
textdob=(TextView) findViewById(R.id.textdob);
textage=(TextView) findViewById(R.id.textage);
intent=getIntent();
Person p1=intent.getExtras().getParcelable("data");
textname.setText(p1.getName());
textage.setText(p1.getAge());
textdob.setText(p1.getDob());
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.second, menu);
return true;
}
}
4.logcat输出(它继续运行)
04-06 16:13:59.272: D/dalvikvm(29765): threadid=4: interp stack at 0x4f34f000
04-06 16:13:59.272: D/jdwp(29765): JDWP: thread running
04-06 16:13:59.273: D/jdwp(29765): acceptConnection
04-06 16:13:59.273: D/jdwp(29765): trying to receive file descriptor from ADB
04-06 16:13:59.273: D/dalvikvm(29765): threadid=5: interp stack at 0x51489000
04-06 16:13:59.273: D/dalvikvm(29765): zygote get thread init done
04-06 16:13:59.273: D/dalvikvm(29765): create interp thread : stack size=32KB
04-06 16:13:59.273: D/dalvikvm(29765): create new thread
04-06 16:13:59.273: D/dalvikvm(29765): new thread created
04-06 16:13:59.273: D/dalvikvm(29765): update thread list
04-06 16:13:59.274: D/dalvikvm(29765): threadid=6: interp stack at 0x51491000
04-06 16:13:59.274: D/dalvikvm(29765): threadid=6: created from interp
04-06 16:13:59.274: D/dalvikvm(29765): start new thread
04-06 16:13:59.274: D/dalvikvm(29765): create interp thread : stack size=32KB
04-06 16:13:59.274: D/dalvikvm(29765): create new thread
04-06 16:13:59.274: D/dalvikvm(29765): new thread created
04-06 16:13:59.274: D/dalvikvm(29765): update thread list
04-06 16:13:59.274: D/dalvikvm(29765): threadid=6: notify debugger
04-06 16:13:59.274: D/dalvikvm(29765): threadid=6 (ReferenceQueueDaemon): calling run()
04-06 16:13:59.274: D/dalvikvm(29765): threadid=7: interp stack at 0x51599000
04-06 16:13:59.274: D/dalvikvm(29765): threadid=7: created from interp
04-06 16:13:59.274: D/dalvikvm(29765): start new thread
04-06 16:13:59.274: D/dalvikvm(29765): create interp thread : stack size=32KB
04-06 16:13:59.274: D/dalvikvm(29765): create new thread
04-06 16:13:59.274: D/dalvikvm(29765): new thread created
04-06 16:13:59.274: D/dalvikvm(29765): update thread list
04-06 16:13:59.275: D/dalvikvm(29765): threadid=7: notify debugger
04-06 16:13:59.276: D/dalvikvm(29765): threadid=7 (FinalizerDaemon): calling run()
04-06 16:13:59.276: D/dalvikvm(29765): threadid=8: interp stack at 0x516a1000
04-06 16:13:59.276: D/dalvikvm(29765): threadid=8: created from interp
04-06 16:13:59.276: D/dalvikvm(29765): start new thread
04-06 16:13:59.277: D/Zygote(29765): fork pid : 0
04-06 16:13:59.281: D/dalvikvm(29765): threadid=8: notify debugger
04-06 16:13:59.281: D/dalvikvm(29765): threadid=8 (FinalizerWatchdogDaemon): calling run()
04-06 16:13:59.290: D/dalvikvm(29765): threadid=9: interp stack at 0x51aa7000
04-06 16:13:59.299: D/dalvikvm(29765): threadid=10: interp stack at 0x51baf000
04-06 16:13:59.302: D/jdwp(29765): received file descriptor 39 from ADB
04-06 16:13:59.302: D/jdwp(29765): processIncoming
04-06 16:13:59.306: E/Trace(29765): error opening trace file: No such file or directory (2)
04-06 16:13:59.307: D/jdwp(29765): sendBufferedRequest : len=0x3D
04-06 16:13:59.307: D/jdwp(29765): processIncoming
04-06 16:13:59.308: D/jdwp(29765): handlePacket : cmd=0x1, cmdSet=0xC7, len=0x13, id=0x4000005C, flags=0x0, dataLen=0x8
04-06 16:13:59.315: D/jdwp(29765): processIncoming
04-06 16:13:59.315: D/jdwp(29765): handlePacket : cmd=0x1, cmdSet=0xC7, len=0x17, id=0x4000005D, flags=0x0, dataLen=0xC
04-06 16:13:59.316: D/jdwp(29765): processIncoming
04-06 16:13:59.316: D/jdwp(29765): handlePacket : cmd=0x1, cmdSet=0xC7, len=0x13, id=0x4000005E, flags=0x0, dataLen=0x8
04-06 16:13:59.316: D/jdwp(29765): processIncoming
04-06 16:13:59.316: D/jdwp(29765): handlePacket : cmd=0x1, cmdSet=0xC7, len=0x13, id=0x4000005F, flags=0x0, dataLen=0x8
04-06 16:13:59.319: D/dalvikvm(29765): open_cached_dex_file : /data/app/com.example.sendobj-2.apk /data/dalvik-cache/data@app@com.example.sendobj-2.apk@classes.dex
04-06 16:13:59.334: D/skia(29765): Flag is not 10
04-06 16:13:59.345: D/skia(29765): Flag is not 10
04-06 16:13:59.500: D/AndroidRuntime(29765): Shutting down VM
04-06 16:13:59.500: W/dalvikvm(29765): threadid=1: thread exiting with uncaught exception (group=0x4191d908)
04-06 16:13:59.502: E/AndroidRuntime(29765): FATAL EXCEPTION: main
04-06 16:13:59.502: E/AndroidRuntime(29765): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.sendobj/com.example.sendobj.Second}: android.os.BadParcelableException: Parcelable protocol requires a Parcelable.Creator object called CREATOR on class com.example.sendobj.Person
04-06 16:13:59.502: E/AndroidRuntime(29765): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2189)
04-06 16:13:59.502: E/AndroidRuntime(29765): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2216)
04-06 16:13:59.502: E/AndroidRuntime(29765): at android.app.ActivityThread.access$600(ActivityThread.java:149)
04-06 16:13:59.502: E/AndroidRuntime(29765): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1305)
04-06 16:13:59.502: E/AndroidRuntime(29765): at android.os.Handler.dispatchMessage(Handler.java:99)
04-06 16:13:59.502: E/AndroidRuntime(29765): at android.os.Looper.loop(Looper.java:153)
04-06 16:13:59.502: E/AndroidRuntime(29765): at android.app.ActivityThread.main(ActivityThread.java:5000)
04-06 16:13:59.502: E/AndroidRuntime(29765): at java.lang.reflect.Method.invokeNative(Native Method)
04-06 16:13:59.502: E/AndroidRuntime(29765): at java.lang.reflect.Method.invoke(Method.java:511)
04-06 16:13:59.502: E/AndroidRuntime(29765): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:821)
04-06 16:13:59.502: E/AndroidRuntime(29765): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:584)
04-06 16:13:59.502: E/AndroidRuntime(29765): at dalvik.system.NativeStart.main(Native Method)
04-06 16:13:59.502: E/AndroidRuntime(29765): Caused by: android.os.BadParcelableException: Parcelable protocol requires a Parcelable.Creator object called CREATOR on class com.example.sendobj.Person
04-06 16:13:59.502: E/AndroidRuntime(29765): at android.os.Parcel.readParcelable(Parcel.java:2086)
04-06 16:13:59.502: E/AndroidRuntime(29765): at android.os.Parcel.readValue(Parcel.java:1965)
04-06 16:13:59.502: E/AndroidRuntime(29765): at android.os.Parcel.readMapInternal(Parcel.java:2226)
04-06 16:13:59.502: E/AndroidRuntime(29765): at android.os.Bundle.unparcel(Bundle.java:223)
04-06 16:13:59.502: E/AndroidRuntime(29765): at android.os.Bundle.getParcelable(Bundle.java:1165)
04-06 16:13:59.502: E/AndroidRuntime(29765): at com.example.sendobj.Second.onCreate(Second.java:20)
04-06 16:13:59.502: E/AndroidRuntime(29765): at android.app.Activity.performCreate(Activity.java:5020)
04-06 16:13:59.502: E/AndroidRuntime(29765): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
04-06 16:13:59.502: E/AndroidRuntime(29765): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2153)
04-06 16:13:59.502: E/AndroidRuntime(29765): ... 11 more
答案 0 :(得分:1)
尝试更新代码的这一部分。如果没有工作,那么提供你的logcat输出。
sw.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
p1.setAge(editage.getText().toString());
p1.setName(editname.getText().toString());
p1.setDob(editdob.getText().toString());
intent=new Intent(MainActivity.this,Second.class);
intent.putExtra("data", p1);
startActivity(intent);
}
});
同样是Hariharan,你还没有初始化p1。
答案 1 :(得分:0)
试试这个..
您尚未在MainActivity
尝试初始化 P1 。那个时候你会得到 NPE
Person p1;
Button sw;
Intent intent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
p1 = new Person();
答案 2 :(得分:0)
Person
课程中的CREATOR必须为public static final
。试试这样:
public static final Parcelable.Creator<MyParcelable> CREATOR
= new Parcelable.Creator<MyParcelable>() {
...
}