在意图之间传递 Parcelable 对象
Passing Parcelable Object between Intents
我在传递我在事件之间创建的对象时遇到问题。我使用网站 http://www.parcelabler.com/ 来创建代码的 parcelable 元素。对象 class 如下所示:(项目 class 是另一个包含字符串和双精度数的简单对象,并且也已成为可打包的)
import android.os.Parcel;
import android.os.Parcelable;
import java.util.ArrayList;
public class Diner implements Parcelable {
private String name;
private ArrayList<Item> itemList = new ArrayList<Item>();
public Diner(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void addItem(Item foodItem) {
itemList.add(foodItem);
foodItem.incrementBuyerCount();
}
public double getPrice() {
double total = 0;
for(Item item : itemList) {
total += item.getPrice() / item.getBuyerCount();
}
return total;
}
protected Diner(Parcel in) {
name = in.readString();
if (in.readByte() == 0x01) {
itemList = new ArrayList<Item>();
in.readList(itemList, Item.class.getClassLoader());
} else {
itemList = null;
}
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);
if (itemList == null) {
dest.writeByte((byte) (0x00));
} else {
dest.writeByte((byte) (0x01));
dest.writeList(itemList);
}
}
@SuppressWarnings("unused")
public static final Parcelable.Creator<Diner> CREATOR = new Parcelable.Creator<Diner>() {
@Override
public Diner createFromParcel(Parcel in) {
return new Diner(in);
}
@Override
public Diner[] newArray(int size) {
return new Diner[size];
}
};
}
在我的主 activity 中,我有一个按钮,当按下按钮并等待结果时,它会打开 'Add Diner' activity。
private final int SET_REQUEST = 1;
addDinerButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(getApplicationContext(), AddDinerActivity.class);
startActivityForResult(intent, SET_REQUEST);
}
});
Add Diner activity 打开,用户在 Diner Name EditText 中输入一个字符串,用于创建新的 Diner 对象和 returns 到主 activity 时按下确定按钮。
okButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = getIntent();
Diner newDiner = new Diner(dinerNameEditText.getText().toString());
intent.putExtra("newDiner", newDiner);
setResult(RESULT_OK, intent);
finish();
}
});
最终接收到 Diner 对象并将其添加到主数组中 activity:
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if(resultCode == RESULT_OK) {
if(requestCode == SET_REQUEST) {
Diner newDiner = getIntent().getParcelableExtra("newDiner");
dinerList.add(newDiner);
}
}
}
不幸的是,当我尝试保存 Diner 对象并将其传递给主程序时,我的代码崩溃了 activity,谁能看出这是为什么?
使用 onActivityResult
方法的第三个参数 data
而不是 getIntent()
从 Activity 发送的 Intent 中获取数据,使用 startActivityForResult
启动:
Diner newDiner = data.getParcelableExtra("newDiner");
我在传递我在事件之间创建的对象时遇到问题。我使用网站 http://www.parcelabler.com/ 来创建代码的 parcelable 元素。对象 class 如下所示:(项目 class 是另一个包含字符串和双精度数的简单对象,并且也已成为可打包的)
import android.os.Parcel;
import android.os.Parcelable;
import java.util.ArrayList;
public class Diner implements Parcelable {
private String name;
private ArrayList<Item> itemList = new ArrayList<Item>();
public Diner(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void addItem(Item foodItem) {
itemList.add(foodItem);
foodItem.incrementBuyerCount();
}
public double getPrice() {
double total = 0;
for(Item item : itemList) {
total += item.getPrice() / item.getBuyerCount();
}
return total;
}
protected Diner(Parcel in) {
name = in.readString();
if (in.readByte() == 0x01) {
itemList = new ArrayList<Item>();
in.readList(itemList, Item.class.getClassLoader());
} else {
itemList = null;
}
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);
if (itemList == null) {
dest.writeByte((byte) (0x00));
} else {
dest.writeByte((byte) (0x01));
dest.writeList(itemList);
}
}
@SuppressWarnings("unused")
public static final Parcelable.Creator<Diner> CREATOR = new Parcelable.Creator<Diner>() {
@Override
public Diner createFromParcel(Parcel in) {
return new Diner(in);
}
@Override
public Diner[] newArray(int size) {
return new Diner[size];
}
};
}
在我的主 activity 中,我有一个按钮,当按下按钮并等待结果时,它会打开 'Add Diner' activity。
private final int SET_REQUEST = 1;
addDinerButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(getApplicationContext(), AddDinerActivity.class);
startActivityForResult(intent, SET_REQUEST);
}
});
Add Diner activity 打开,用户在 Diner Name EditText 中输入一个字符串,用于创建新的 Diner 对象和 returns 到主 activity 时按下确定按钮。
okButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = getIntent();
Diner newDiner = new Diner(dinerNameEditText.getText().toString());
intent.putExtra("newDiner", newDiner);
setResult(RESULT_OK, intent);
finish();
}
});
最终接收到 Diner 对象并将其添加到主数组中 activity:
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if(resultCode == RESULT_OK) {
if(requestCode == SET_REQUEST) {
Diner newDiner = getIntent().getParcelableExtra("newDiner");
dinerList.add(newDiner);
}
}
}
不幸的是,当我尝试保存 Diner 对象并将其传递给主程序时,我的代码崩溃了 activity,谁能看出这是为什么?
使用 onActivityResult
方法的第三个参数 data
而不是 getIntent()
从 Activity 发送的 Intent 中获取数据,使用 startActivityForResult
启动:
Diner newDiner = data.getParcelableExtra("newDiner");