Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/192.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android将arraylist传递回父活动_Java_Android_Arraylist - Fatal编程技术网

Java Android将arraylist传递回父活动

Java Android将arraylist传递回父活动,java,android,arraylist,Java,Android,Arraylist,我一直在寻找一个简单的例子,但运气不好 在我的android应用程序中,我有两项活动: 1.启动时启动的主要活动 2.通过按下主活动上的按钮启动的第二个活动 当第二个活动完成时(通过按下按钮),我希望它将MyObject类型的ArrayList发送回主活动并关闭自身,然后主活动可以对其执行任何操作。我将如何实现这一目标?我一直在尝试一些事情,但当我开始第二个活动时,它会使我的应用程序崩溃 当用户按下按钮启动第二个活动时: Intent i = new Intent(Mai

我一直在寻找一个简单的例子,但运气不好

在我的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();
按下第二个活动上的按钮后绑定回的阵列:

            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%。)

activityresult上受保护的void(int-requestCode、int-resultCode、Intent-data){
super.onActivityResult(请求代码、结果代码、数据);
if(resultCode==RESULT\u OK&&requestCode==1){
Bundle extras=data.getExtras();
最终ArrayList mylist=extras.getParcelableArrayList(“myarraylist”);
Toast.makeText(MainActivity.this,mylist.get(0).getName(),Toast.LENGTH_SHORT).show();
}
}
你知道我哪里出错了吗?onActivityResult()似乎正在使我的应用程序崩溃

编辑:使用可包裹方法初始化:

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];
        }

    };

}
导入android.os.packet;
导入android.os.Parcelable;
公共类计划实现了Parcelable{
私有字符串名称;
私有字符串id;
公共计划(){
}
公共平面图createFromParcel(地块中){
计划=新计划();
plan.setId(in.readString());
plan.setName(in.readString());
退货计划;
}
公共计划(字符串名称、字符串id){
this.name=名称;
this.id=id;
}
公共字符串getName(){
返回名称;
}
公共void集合名(字符串名){
this.name=名称;
}
公共字符串getId(){
返回id;
}
公共无效集合id(字符串id){
this.id=id;
}
公共字符串toString(){
返回“计划ID:+ID+”计划名称:+Name;
}
@凌驾
公共int描述内容(){
//TODO自动生成的方法存根
返回0;
}
@凌驾
公共无效写入包裹(包裹目的地,内部标志){
目的写入限制(id);
目的地书面记录(名称);
}
公共静态最终包裹。创建者
=新的Parcelable.Creator(){
公共平面图createFromParcel(地块中){
返回新计划();
}
@凌驾
公共计划[]新数组(整数大小){
//TODO自动生成的方法存根
返回新计划[大小];
}
};
}
第二个活动完成后,将调用onactivityresult,但toast中没有显示任何内容,即为空。有什么想法吗?我猜我的课还是一团糟

编辑:开始工作了

我的方法是彼得在错误的地方提供的。它应该在creator内部,如下所示:

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;
}
公共静态最终包裹。创建者
=新的Parcelable.Creator(){
公共平面图createFromParcel(地块中){
计划=新计划();
plan.setId(in.readString());
plan.setName(in.readString());
退货计划;
}
而不是靠自己


非常感谢Peter!希望这对其他人有所帮助。

您的类
MyObject
必须实现,以便在放入捆绑包时被Android序列化/反序列化

更新:

方法名称为
createFromParcel
。实际上,您必须根据地块中的数据创建对象平面:

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

它确实实现了parcelable。尽管我必须在类的底部放置两个空方法才能使其工作:@Override public int descripbecontents(){//TODO Auto-generated method stub return 0;}@Override public void writeToParcel(Parcel dest,int flags){//TODO Auto generated method stub}这就是问题所在:您必须在这些方法中实际实现某些内容。当系统需要创建MyObject的序列化形式时,会调用它们。我应该在它们内部实现什么?您的类还必须有一个名为CREATOR的静态字段。请看
writeToParcel()中的简单示例
您必须将MyObject中的所有数据写入一个包裹。在CREATOR中,您必须能够从包裹中实例化MyObject。能否提供一些Logcat输出?另外,您说启动第二个活动会使应用程序崩溃。是否还有其他问题?