我一直试图将array
个对象从一个活动传递到另一个活动。我一直在搜索,您的对象似乎必须实现Parcelable
或Serializable
。 (这对我没有多大意义。我不知道为什么你可以将对象数组传递给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)
答案 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
从其他类调用