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