将一组对象发送到另一个 activity
Send an array of objects to another activity
我正在尝试将对象的 ArrayList 发送到另一个活动,但我在 logcat 上收到此错误,我找不到解决它的方法,我是初学者。
肌肉类:
public class GrupoMuscular implements Parcelable{
private int id;
private static int id_aux = 0;
private String nome;
private int imagem;
private List<Exercicio> exercicios;
public GrupoMuscular(String nome, int img) {
//super();
id = id_aux;
id_aux++;
this.nome = nome;
this.imagem = img;
this.exercicios = new ArrayList<Exercicio>();
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public int getImagem() {
return imagem;
}
public void setImagem(int imagem) {
this.imagem = imagem;
}
public List<Exercicio> getGruposMuscular() {
return exercicios;
}
public void addExercicio(int id, String nome, String descricao, int imagem){
Exercicio ex = new Exercicio(id, nome, descricao, imagem);
exercicios.add(ex);
}
public void setGruposMuscular(List<Exercicio> gruposMuscular) {
this.exercicios = gruposMuscular;
}
public List<Exercicio> getExercicios() {
return exercicios;
}
public void setExercicios(List<Exercicio> exercicios) {
this.exercicios = exercicios;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Override
public int describeContents() {
// TODO Auto-generated method stub
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
// TODO Auto-generated method stub
}
}
练习活动:
这是当我尝试发送数组时,当我单击列表视图中的项目时。
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Intent intent;
intent = new Intent(ExerciciosActivity.this, ListaExerciciosActivity.class);
intent.putParcelableArrayListExtra("gruposMusculares", gruposMusculares);
startActivity(intent);
}});
}
ListaExerciciosActivity:
这是我要接收数组的地方。
gruposMusculares = getIntent().getParcelableArrayListExtra("gruposMusculares");
Logcat:
01-03 18:24:08.889: E/AndroidRuntime(18813): FATAL EXCEPTION: main
01-03 18:24:08.889: E/AndroidRuntime(18813): Process: com.AMOV.mr.fit, PID: 18813
01-03 18:24:08.889: E/AndroidRuntime(18813): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.AMOV.mr.fit/com.AMOV.mr.fit.ListaExerciciosActivity}: android.os.BadParcelableException: Parcelable protocol requires a Parcelable.Creator object called CREATOR on class com.AMOV.mr.fit.GrupoMuscular
01-03 18:24:08.889: E/AndroidRuntime(18813): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2215)
01-03 18:24:08.889: E/AndroidRuntime(18813): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2265)
01-03 18:24:08.889: E/AndroidRuntime(18813): at android.app.ActivityThread.access0(ActivityThread.java:145)
01-03 18:24:08.889: E/AndroidRuntime(18813): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1206)
01-03 18:24:08.889: E/AndroidRuntime(18813): at android.os.Handler.dispatchMessage(Handler.java:102)
01-03 18:24:08.889: E/AndroidRuntime(18813): at android.os.Looper.loop(Looper.java:136)
01-03 18:24:08.889: E/AndroidRuntime(18813): at android.app.ActivityThread.main(ActivityThread.java:5144)
01-03 18:24:08.889: E/AndroidRuntime(18813): at java.lang.reflect.Method.invokeNative(Native Method)
01-03 18:24:08.889: E/AndroidRuntime(18813): at java.lang.reflect.Method.invoke(Method.java:515)
01-03 18:24:08.889: E/AndroidRuntime(18813): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
01-03 18:24:08.889: E/AndroidRuntime(18813): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605)
01-03 18:24:08.889: E/AndroidRuntime(18813): at dalvik.system.NativeStart.main(Native Method)
01-03 18:24:08.889: E/AndroidRuntime(18813): Caused by: android.os.BadParcelableException: Parcelable protocol requires a Parcelable.Creator object called CREATOR on class com.AMOV.mr.fit.GrupoMuscular
01-03 18:24:08.889: E/AndroidRuntime(18813): at android.os.Parcel.readParcelableCreator(Parcel.java:2156)
01-03 18:24:08.889: E/AndroidRuntime(18813): at android.os.Parcel.readParcelable(Parcel.java:2097)
01-03 18:24:08.889: E/AndroidRuntime(18813): at android.os.Parcel.readValue(Parcel.java:2013)
01-03 18:24:08.889: E/AndroidRuntime(18813): at android.os.Parcel.readListInternal(Parcel.java:2343)
01-03 18:24:08.889: E/AndroidRuntime(18813): at android.os.Parcel.readArrayList(Parcel.java:1703)
01-03 18:24:08.889: E/AndroidRuntime(18813): at android.os.Parcel.readValue(Parcel.java:2034)
01-03 18:24:08.889: E/AndroidRuntime(18813): at android.os.Parcel.readArrayMapInternal(Parcel.java:2314)
01-03 18:24:08.889: E/AndroidRuntime(18813): at android.os.Bundle.unparcel(Bundle.java:249)
01-03 18:24:08.889: E/AndroidRuntime(18813): at android.os.Bundle.getParcelableArrayList(Bundle.java:1250)
01-03 18:24:08.889: E/AndroidRuntime(18813): at android.content.Intent.getParcelableArrayListExtra(Intent.java:4729)
01-03 18:24:08.889: E/AndroidRuntime(18813): at com.AMOV.mr.fit.ListaExerciciosActivity.onCreate(ListaExerciciosActivity.java:27)
01-03 18:24:08.889: E/AndroidRuntime(18813): at android.app.Activity.performCreate(Activity.java:5231)
01-03 18:24:08.889: E/AndroidRuntime(18813): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
01-03 18:24:08.889: E/AndroidRuntime(18813): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2169)
你没有正确地使你的 class Parcerable - 你的 writeToParcel
方法是空的,你还没有创建 CREATOR
对象。
Android Developers:
上描述了实现 Parcerable 接口的真正简单示例
http://developer.android.com/reference/android/os/Parcelable.html
将自定义对象 class 发送到另一个 activity 的更简单方法是使用 Serializable 接口 - 您的 class 只需实现它,整个工作就完成了。
intent = new Intent(ExerciciosActivity.this, ListaExerciciosActivity.class);
Bundle bundle = new Bundle();
bundle.putSerializable("gruposMusculares", gruposMusculares);
intent.putExtras(bundle);
startActivity(intent);
请注意,通过 Serializable 发送对象比通过 Parcerable 发送对象要慢一点,并且实现 Serializable 的 class 中包含的所有对象 class 也必须实现 Serializable。
您的 class 缺少创作者:
实现Parcelable接口的Class还必须有一个名为CREATOR的静态字段,它是一个实现了Parcelable.Creator接口的对象。
public static final Parcelable.Creator<GrupoMuscular> CREATOR
= new Parcelable.Creator<GrupoMuscular>() {
public GrupoMuscular createFromParcel(Parcel in) {
return new GrupoMuscular(in);
}
public GrupoMuscular[] newArray(int size) {
return new GrupoMuscular[size];
}
};
希望对您有所帮助!
我正在尝试将对象的 ArrayList 发送到另一个活动,但我在 logcat 上收到此错误,我找不到解决它的方法,我是初学者。
肌肉类:
public class GrupoMuscular implements Parcelable{
private int id;
private static int id_aux = 0;
private String nome;
private int imagem;
private List<Exercicio> exercicios;
public GrupoMuscular(String nome, int img) {
//super();
id = id_aux;
id_aux++;
this.nome = nome;
this.imagem = img;
this.exercicios = new ArrayList<Exercicio>();
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public int getImagem() {
return imagem;
}
public void setImagem(int imagem) {
this.imagem = imagem;
}
public List<Exercicio> getGruposMuscular() {
return exercicios;
}
public void addExercicio(int id, String nome, String descricao, int imagem){
Exercicio ex = new Exercicio(id, nome, descricao, imagem);
exercicios.add(ex);
}
public void setGruposMuscular(List<Exercicio> gruposMuscular) {
this.exercicios = gruposMuscular;
}
public List<Exercicio> getExercicios() {
return exercicios;
}
public void setExercicios(List<Exercicio> exercicios) {
this.exercicios = exercicios;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Override
public int describeContents() {
// TODO Auto-generated method stub
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
// TODO Auto-generated method stub
}
}
练习活动: 这是当我尝试发送数组时,当我单击列表视图中的项目时。
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Intent intent;
intent = new Intent(ExerciciosActivity.this, ListaExerciciosActivity.class);
intent.putParcelableArrayListExtra("gruposMusculares", gruposMusculares);
startActivity(intent);
}});
}
ListaExerciciosActivity: 这是我要接收数组的地方。
gruposMusculares = getIntent().getParcelableArrayListExtra("gruposMusculares");
Logcat:
01-03 18:24:08.889: E/AndroidRuntime(18813): FATAL EXCEPTION: main
01-03 18:24:08.889: E/AndroidRuntime(18813): Process: com.AMOV.mr.fit, PID: 18813
01-03 18:24:08.889: E/AndroidRuntime(18813): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.AMOV.mr.fit/com.AMOV.mr.fit.ListaExerciciosActivity}: android.os.BadParcelableException: Parcelable protocol requires a Parcelable.Creator object called CREATOR on class com.AMOV.mr.fit.GrupoMuscular
01-03 18:24:08.889: E/AndroidRuntime(18813): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2215)
01-03 18:24:08.889: E/AndroidRuntime(18813): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2265)
01-03 18:24:08.889: E/AndroidRuntime(18813): at android.app.ActivityThread.access0(ActivityThread.java:145)
01-03 18:24:08.889: E/AndroidRuntime(18813): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1206)
01-03 18:24:08.889: E/AndroidRuntime(18813): at android.os.Handler.dispatchMessage(Handler.java:102)
01-03 18:24:08.889: E/AndroidRuntime(18813): at android.os.Looper.loop(Looper.java:136)
01-03 18:24:08.889: E/AndroidRuntime(18813): at android.app.ActivityThread.main(ActivityThread.java:5144)
01-03 18:24:08.889: E/AndroidRuntime(18813): at java.lang.reflect.Method.invokeNative(Native Method)
01-03 18:24:08.889: E/AndroidRuntime(18813): at java.lang.reflect.Method.invoke(Method.java:515)
01-03 18:24:08.889: E/AndroidRuntime(18813): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
01-03 18:24:08.889: E/AndroidRuntime(18813): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605)
01-03 18:24:08.889: E/AndroidRuntime(18813): at dalvik.system.NativeStart.main(Native Method)
01-03 18:24:08.889: E/AndroidRuntime(18813): Caused by: android.os.BadParcelableException: Parcelable protocol requires a Parcelable.Creator object called CREATOR on class com.AMOV.mr.fit.GrupoMuscular
01-03 18:24:08.889: E/AndroidRuntime(18813): at android.os.Parcel.readParcelableCreator(Parcel.java:2156)
01-03 18:24:08.889: E/AndroidRuntime(18813): at android.os.Parcel.readParcelable(Parcel.java:2097)
01-03 18:24:08.889: E/AndroidRuntime(18813): at android.os.Parcel.readValue(Parcel.java:2013)
01-03 18:24:08.889: E/AndroidRuntime(18813): at android.os.Parcel.readListInternal(Parcel.java:2343)
01-03 18:24:08.889: E/AndroidRuntime(18813): at android.os.Parcel.readArrayList(Parcel.java:1703)
01-03 18:24:08.889: E/AndroidRuntime(18813): at android.os.Parcel.readValue(Parcel.java:2034)
01-03 18:24:08.889: E/AndroidRuntime(18813): at android.os.Parcel.readArrayMapInternal(Parcel.java:2314)
01-03 18:24:08.889: E/AndroidRuntime(18813): at android.os.Bundle.unparcel(Bundle.java:249)
01-03 18:24:08.889: E/AndroidRuntime(18813): at android.os.Bundle.getParcelableArrayList(Bundle.java:1250)
01-03 18:24:08.889: E/AndroidRuntime(18813): at android.content.Intent.getParcelableArrayListExtra(Intent.java:4729)
01-03 18:24:08.889: E/AndroidRuntime(18813): at com.AMOV.mr.fit.ListaExerciciosActivity.onCreate(ListaExerciciosActivity.java:27)
01-03 18:24:08.889: E/AndroidRuntime(18813): at android.app.Activity.performCreate(Activity.java:5231)
01-03 18:24:08.889: E/AndroidRuntime(18813): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
01-03 18:24:08.889: E/AndroidRuntime(18813): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2169)
你没有正确地使你的 class Parcerable - 你的 writeToParcel
方法是空的,你还没有创建 CREATOR
对象。
Android Developers:
http://developer.android.com/reference/android/os/Parcelable.html
将自定义对象 class 发送到另一个 activity 的更简单方法是使用 Serializable 接口 - 您的 class 只需实现它,整个工作就完成了。
intent = new Intent(ExerciciosActivity.this, ListaExerciciosActivity.class);
Bundle bundle = new Bundle();
bundle.putSerializable("gruposMusculares", gruposMusculares);
intent.putExtras(bundle);
startActivity(intent);
请注意,通过 Serializable 发送对象比通过 Parcerable 发送对象要慢一点,并且实现 Serializable 的 class 中包含的所有对象 class 也必须实现 Serializable。
您的 class 缺少创作者:
实现Parcelable接口的Class还必须有一个名为CREATOR的静态字段,它是一个实现了Parcelable.Creator接口的对象。
public static final Parcelable.Creator<GrupoMuscular> CREATOR
= new Parcelable.Creator<GrupoMuscular>() {
public GrupoMuscular createFromParcel(Parcel in) {
return new GrupoMuscular(in);
}
public GrupoMuscular[] newArray(int size) {
return new GrupoMuscular[size];
}
};
希望对您有所帮助!