【问题标题】:Problems with parcelable custom object - Android可打包自定义对象的问题 - Android
【发布时间】:2018-07-25 08:18:03
【问题描述】:

我正在尝试将自定义对象从一个活动传递到另一个活动。 我发现我们可以使用 bundle 将数据传递到 Intent 中,并且我们需要在我们的类中实现一个 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);
}

在这个类中,我有另一个自定义对象的列表:

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

我认为到这里为止一切都会好起来的。

在我的活动中:

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 这就是我获取 item 变量的方式:

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

每当我点击一个回收站视图项时,上面的代码就会被执行。

【问题讨论】:

  • 能否提供item变量创建的代码?
  • @Lino 如果我添加的内容还不够,请告诉我
  • 我建议您使用 parceler 库通过意图传递数据。 github.com/johncarl81/parceler

标签: java android parcelable


【解决方案1】:

在@BVantur 的建议下,我使用 parceler 库解决了我的问题: parceler library

它非常有用,易于使用,而且文档很好!我强烈推荐它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-30
    • 2011-07-03
    • 2012-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多