将一组对象发送到另一个 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];
     }
 };

希望对您有所帮助!