如何使用putExtra()将自定义对象从一个活动传递到另一个活动

时间:2014-03-27 03:42:47

标签: android android-intent android-activity

我一直试图将array个对象从一个活动传递到另一个活动。我一直在搜索,您的对象似乎必须实现ParcelableSerializable。 (这对我没有多大意义。我不知道为什么你可以将对象数组传递给putExtra())。我不是试图传递一个特定的int或String,而是一个让人们说对象的数组。但我一直遇到麻烦。我想传入的对象数组是一个包含bitmap和几个字符串的对象数组。我试图让我的对象同时实现Parcelable和Serializable,但我一直在犯错误。这是我实现Serializable时出现的错误。有人有任何提示吗?

03-26 20:35:53.886: E/AndroidRuntime(30066): FATAL EXCEPTION: main
03-26 20:35:53.886: E/AndroidRuntime(30066): Process: com.example.test, PID:    30066
03-26 20:35:53.886: E/AndroidRuntime(30066): java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = com.example.test.Person)
03-26 20:35:53.886: E/AndroidRuntime(30066):    at android.os.Parcel.writeSerializable(Parcel.java:1316)
03-26 20:35:53.886: E/AndroidRuntime(30066):    at android.os.Parcel.writeValue(Parcel.java:1264)
03-26 20:35:53.886: E/AndroidRuntime(30066):    at android.os.Parcel.writeArrayMapInternal(Parcel.java:618)
03-26 20:35:53.886: E/AndroidRuntime(30066):    at android.os.Bundle.writeToParcel(Bundle.java:1692)
03-26 20:35:53.886: E/AndroidRuntime(30066):    at android.os.Parcel.writeBundle(Parcel.java:636)
03-26 20:35:53.886: E/AndroidRuntime(30066):    at android.content.Intent.writeToParcel(Intent.java:7414)
03-26 20:35:53.886: E/AndroidRuntime(30066):    at android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:2289)
03-26 20:35:53.886: E/AndroidRuntime(30066):    at android.app.Instrumentation.execStartActivity(Instrumentation.java:1437)
03-26 20:35:53.886: E/AndroidRuntime(30066):    at android.app.Activity.startActivityForResult(Activity.java:3511)
03-26 20:35:53.886: E/AndroidRuntime(30066):    at android.app.Activity.startActivityForResult(Activity.java:3472)  
03-26 20:35:53.886: E/AndroidRuntime(30066):    at android.app.Activity.startActivity(Activity.java:3714)
03-26 20:35:53.886: E/AndroidRuntime(30066):    at android.app.Activity.startActivity(Activity.java:3682)
03-26 20:35:53.886: E/AndroidRuntime(30066):    at    com.example.test.MainActivity$1.onItemClick(MainActivity.java:54)

6 个答案:

答案 0 :(得分:1)

Intent intent=new Intent(MainActivity.this,secondAcitity.class);                                                                                                                            Bundle extras=new Bundle();                                                     

    YourObject mObject = new YourObject();                                              

    extras.putSerializable("tag",mObject)
    intent.putExtras(extras);
    startActivity(intent);

YourObject

 public class YourObject implements Serializable
    {
private String name;//generate your getters n setter
    }

在secondActivity中

 YourObject receivedmObject = (YourObject ) getIntent().getExtras().getSerializable(
            "tag");

答案 1 :(得分:0)

您不希望传递位图或包含位图的对象,更不用说包含位图的对象数组。

从崩溃日志看起来,您的Person对象也实现了Parcelable(同时实现了Serializable)。删除implements Parcelable,错误就会消失。

我建议您的Person对象只包含位图的URI(weblink或本地存储uri),并仅在需要时构建Bitmaps。

答案 2 :(得分:0)

在我的情况下,我总是使用单例在两个活动之间共享自定义对象。您也可以使用Parcelable/Serializable

Singleton示例: http://pastebin.com/pBeB7FBv

在您的第一个活动中,

SharedData sd = SharedData.getInstance();
sd.setObjectList(your_object_list); 

在你的第二个活动中,

SharedData sd = SharedData.getInstance();
ArrayList<Object> myObjList = new ArrayList<Object>;
myObjList = sd.getObjectList(); 

手写,所以可能需要稍微调整一下。

了解详情:http://developer.android.com/guide/faq/framework.html#3

答案 3 :(得分:0)

你只能在可以Parcelable或Serializable的Intent之间传递一个对象。 this是一个很好的例子

public class Student implements Parcelable{
    private String id;
    private String name;
    private String grade;

    // Constructor
    public Student(String id, String name, String grade){
        this.id = id;
        this.name = name;
        this.grade = grade;
   }
   // Getter and setter methods
   .........
   .........

   // Parcelling part
   public Student(Parcel in){
       String[] data = new String[3];

       in.readStringArray(data);
       this.id = data[0];
       this.name = data[1];
       this.grade = data[2];
   }

   @Оverride
   public int describeContents(){
       return 0;
   }

   @Override
   public void writeToParcel(Parcel dest, int flags) {
       dest.writeStringArray(new String[] {this.id,
                                           this.name,
                                           this.grade});
   }
   public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
       public Student createFromParcel(Parcel in) {
           return new Student(in); 
       }

       public Student[] newArray(int size) {
           return new Student[size];
       }
   };
}

根据您的需要进行更改。 请记住 CREATOR应定义为public static final Parcelable.Creator

答案 4 :(得分:0)

我也是物品转移的受害者,经历了可序列化,可分割和使用Gson。最后,我成功使用了Eventbus。 要在两个活动之间传输自定义对象,“EventBus”可能很有用。 要设置EventBus,只需从here下载.jar并在Android项目中引用它。

在您的SourceActivity中

Intent intent = new Intent(this,Destination.class); de.greenrobot.event.EventBus.getDefault().postSticky(your_Object_to_send); startActivity(Intent);

在您的DestinationActivity中

Object myObject = (Object)EventBus.getDefault().removeStickyEvent(Object.class)

请注意,不需要复杂的东西。 效率比较由史蒂文

完成here

答案 5 :(得分:-1)

使用static关键字访问数组。定义实现的数组静态,并使用ClassName.array

从其他类调用