可打包自定义对象的问题 - Android
Problems with parcelable custom object - Android
我正在尝试将自定义对象从一个 activity 传递到另一个。
我发现我们可以使用 bundle 将数据传递到 intent 中,并且我们需要在 class.
中实现一个 parcelable 接口
在下面的代码中,我删除了无用的东西。
public class TravelCard implements Parcelable {
public static final Creator<TravelCard> CREATOR = new Creator<TravelCard>() {
@Override
public TravelCard createFromParcel(Parcel in) {
return new TravelCard(in);
}
@Override
public TravelCard[] newArray(int size) {
return new TravelCard[size];
}
};
private String travelTitle, travelCountry, dateRange, numOfPerson;
private List<TravelDay> days;
protected TravelCard(Parcel in) {
travelTitle = in.readString();
travelCountry = in.readString();
dateRange = in.readString();
numOfPerson = in.readString();
in.readTypedList(days, TravelDay.CREATOR);
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(this.travelTitle);
dest.writeString(this.travelCountry);
dest.writeString(this.dateRange);
dest.writeString(this.numOfPerson);
dest.writeTypedList(this.days);
}
在这个 class 中,我有另一个自定义对象的列表:
public class TravelDay implements Parcelable {
public static final Creator<TravelDay> CREATOR = new Creator<TravelDay>() {
@Override
public TravelDay createFromParcel(Parcel in) {
return new TravelDay(in);
}
@Override
public TravelDay[] newArray(int size) {
return new TravelDay[size];
}
};
public int current_day;
private String title, note, dateOfToday;
protected TravelDay(Parcel in) {
title = in.readString();
note = in.readString();
dateOfToday = in.readString();
current_day = in.readInt();
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(title);
dest.writeString(note);
dest.writeString(dateOfToday);
dest.writeInt(current_day);
}
我想到这里为止一切都应该没问题。
在我的 activity 中:
Intent intent = new Intent(MainActivity.this, TravelDayActivity.class);
Bundle data = new Bundle();
data.putParcelable(DataKey.TRAVEL_CARD_BUNDLE,item);
intent.putExtras(data);
startActivity(intent);
然后在 TravelDayActivity 中:
Intent intent = getIntent();
Bundle data = intent.getExtras();
TravelCard travelCard = data.getParcelable(DataKey.TRAVEL_CARD_BUNDLE);
每次我尝试访问 TravelDayActivity 时,应用程序都会停止 运行。
我使用调试模式搜索错误,但我没有找到任何东西。
提前谢谢你
编辑:
在 MainActivity 中,这就是我获取项目变量的方式:
mAdapter = new TravelCardAdapter(travelCards, new TravelCardAdapter.OnItemClickListener() {
@Override
public void onItemClick(TravelCard item) {
Intent intent = new Intent(MainActivity.this,TravelDayActivity.class);
Bundle data = new Bundle();
data.putParcelable(DataKey.TRAVEL_CARD_BUNDLE,item);
intent.putExtras(data);
startActivity(intent);
}
});
每当我单击其中一个回收器视图项目时,就会执行上面的代码。
在@BVantur 的建议下,我使用 parceler 库解决了我的问题:
parceler library
它非常有帮助,易于使用且文档很好!我强烈推荐它。
我正在尝试将自定义对象从一个 activity 传递到另一个。 我发现我们可以使用 bundle 将数据传递到 intent 中,并且我们需要在 class.
中实现一个 parcelable 接口在下面的代码中,我删除了无用的东西。
public class TravelCard implements Parcelable {
public static final Creator<TravelCard> CREATOR = new Creator<TravelCard>() {
@Override
public TravelCard createFromParcel(Parcel in) {
return new TravelCard(in);
}
@Override
public TravelCard[] newArray(int size) {
return new TravelCard[size];
}
};
private String travelTitle, travelCountry, dateRange, numOfPerson;
private List<TravelDay> days;
protected TravelCard(Parcel in) {
travelTitle = in.readString();
travelCountry = in.readString();
dateRange = in.readString();
numOfPerson = in.readString();
in.readTypedList(days, TravelDay.CREATOR);
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(this.travelTitle);
dest.writeString(this.travelCountry);
dest.writeString(this.dateRange);
dest.writeString(this.numOfPerson);
dest.writeTypedList(this.days);
}
在这个 class 中,我有另一个自定义对象的列表:
public class TravelDay implements Parcelable {
public static final Creator<TravelDay> CREATOR = new Creator<TravelDay>() {
@Override
public TravelDay createFromParcel(Parcel in) {
return new TravelDay(in);
}
@Override
public TravelDay[] newArray(int size) {
return new TravelDay[size];
}
};
public int current_day;
private String title, note, dateOfToday;
protected TravelDay(Parcel in) {
title = in.readString();
note = in.readString();
dateOfToday = in.readString();
current_day = in.readInt();
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(title);
dest.writeString(note);
dest.writeString(dateOfToday);
dest.writeInt(current_day);
}
我想到这里为止一切都应该没问题。
在我的 activity 中:
Intent intent = new Intent(MainActivity.this, TravelDayActivity.class);
Bundle data = new Bundle();
data.putParcelable(DataKey.TRAVEL_CARD_BUNDLE,item);
intent.putExtras(data);
startActivity(intent);
然后在 TravelDayActivity 中:
Intent intent = getIntent();
Bundle data = intent.getExtras();
TravelCard travelCard = data.getParcelable(DataKey.TRAVEL_CARD_BUNDLE);
每次我尝试访问 TravelDayActivity 时,应用程序都会停止 运行。 我使用调试模式搜索错误,但我没有找到任何东西。 提前谢谢你
编辑: 在 MainActivity 中,这就是我获取项目变量的方式:
mAdapter = new TravelCardAdapter(travelCards, new TravelCardAdapter.OnItemClickListener() {
@Override
public void onItemClick(TravelCard item) {
Intent intent = new Intent(MainActivity.this,TravelDayActivity.class);
Bundle data = new Bundle();
data.putParcelable(DataKey.TRAVEL_CARD_BUNDLE,item);
intent.putExtras(data);
startActivity(intent);
}
});
每当我单击其中一个回收器视图项目时,就会执行上面的代码。
在@BVantur 的建议下,我使用 parceler 库解决了我的问题: parceler library
它非常有帮助,易于使用且文档很好!我强烈推荐它。