Android将arraylist传递回父活动

时间:2011-03-05 23:29:01

标签: java android arraylist

我一直在寻找一个没有运气的简单例子。

在我的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;
}

而不是单独出来。

非常感谢彼得!希望这有助于其他人。

1 个答案:

答案 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;
}