我一直在寻找一个没有运气的简单例子。
在我的Android应用程序中,我有两个活动: 1.在启动时启动的主要活动 2.通过按下主要活动上的按钮启动的第二个活动。
当第二个活动完成时(通过按下按钮)我希望它将一个MyObject类型的ArrayList发送回主活动并关闭它自己,然后主活动可以对它做任何事情。我将如何实现这一目标?我一直在尝试一些事情,但是当我开始第二次活动时,它正在崩溃我的应用程序。
当用户按下按钮以启动第二个活动时:
Intent i = new Intent(MainActivity.this, secondactivity.class);
startActivityForResult(i, 1);
按下第二个活动上的按钮后捆绑回的数组:
Intent intent= getIntent();
Bundle b = new Bundle();
b.putParcelableArrayList("myarraylist", mylist);
intent.putExtras(b);
setResult(RESULT_OK, intent);
finish();
最后是一个关于主要活动的监听器(虽然这个代码启动时我不确定100%...)
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(resultCode==RESULT_OK && requestCode==1){
Bundle extras = data.getExtras();
final ArrayList<MyObject> mylist = extras.getParcelableArrayList("myarraylist");
Toast.makeText(MainActivity.this, mylist.get(0).getName(), Toast.LENGTH_SHORT).show();
}
}
我出错的任何想法? onActivityResult()似乎正在崩溃我的应用程序。
编辑:使用parcelable方法的类:
import android.os.Parcel;
import android.os.Parcelable;
public class Plan implements Parcelable{
private String name;
private String id;
public Plan(){
}
public Plan createFromParcel(Parcel in) {
Plan plan = new Plan();
plan.setId(in.readString());
plan.setName(in.readString());
return plan;
}
public Plan(String name, String id){
this.name = name;
this.id = id;
}
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
public String getId(){
return id;
}
public void setId(String id){
this.id = id;
}
public String toString(){
return "Plan ID: " + id + " Plan Name: " + name;
}
@Override
public int describeContents() {
// TODO Auto-generated method stub
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(id);
dest.writeString(name);
}
public static final Parcelable.Creator<Plan> CREATOR
= new Parcelable.Creator<Plan>() {
public Plan createFromParcel(Parcel in) {
return new Plan();
}
@Override
public Plan[] newArray(int size) {
// TODO Auto-generated method stub
return new Plan[size];
}
};
}
第二个活动完成后,会调用onactivityresult,但是吐司内部没有任何内容,它是空白的。有任何想法吗?我猜我的班级仍然搞砸了......
编辑:让它工作
我有彼得提供错误位置的方法。它应该是内部创建者,如下所示:
public static final Parcelable.Creator<Plan> CREATOR
= new Parcelable.Creator<Plan>() {
public Plan createFromParcel(Parcel in) {
Plan plan = new Plan();
plan.setId(in.readString());
plan.setName(in.readString());
return plan;
}
而不是单独出来。
非常感谢彼得!希望这有助于其他人。
答案 0 :(得分:2)
您的班级MyObject
必须实施Parcelable
才能在安装到Bundle内时由Android进行序列化/反序列化。
<强>更新强>
方法名称为createFromParcel
。实际上,您必须根据宗地中的数据创建对象计划:
public Plan createFromParcel(Parcel in) {
Plan plan = new Plan();
plan.setId(in.readString());
plan.setName(in.readString());
return plan;
}