2011-03-05 20 views
1

我一直在寻找一个简单的例子,但没有运气。Android将数组列表传回给父代活动

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

您能否提供一些Logcat输出?此外,你说*开始*第二个活动崩溃你的应用程序。会不会有另一个问题? – Shade 2011-03-05 23:44:27

+0

已被添加到主标题 – 2011-03-06 00:08:39

回答

2

您的类MyObject必须实现Parcelable才能在Android中进行序列化/反序列化时放入Bundle中。

更新:

方法名是createFromParcel。实际上,您必须创建您的物体从包裹中的数据计划:

public Plan createFromParcel(Parcel in) { 
     Plan plan = new Plan(); 
     plan.setId(in.readString()); 
     plan.setName(in.readString()); 
     return plan; 
} 
+0

它实现了parcelable。虽然我只好把2种空方法在类的底部得到它的工作:\t @覆盖 \t公众诠释describeContents(){ \t \t // TODO自动生成方法存根 \t \t返回0; \t} \t @覆盖 \t公共无效writeToParcel(包裹DEST,诠释标志){ \t \t // TODO自动生成方法存根 \t \t \t} – 2011-03-05 23:38:34

+0

这就是问题所在:你必须真正实现东西在那些方法中。系统需要创建MyObjects的序列化表单时才会调用它们。 – 2011-03-05 23:45:50

+0

我应该在他们内部实施什么? – 2011-03-05 23:46:55

相关问题