【问题标题】:Creating and passing object to activity fails创建对象并将其传递给活动失败
【发布时间】:2017-12-26 08:28:55
【问题描述】:

我想创建一个对象并将其通过 Intent 传递给另一个 Activity,这样我就可以处理该 Activity 中的对象详细信息并将其显示给用户。

这个对象被一个长值标识。 我有一个数组列表(releaseIds),其中包含该对象的几个长值,所以我只想通过意图将这些值传递给其他活动。

用户可以从显示此列表的警报对话框中选择所需的对象,一旦他/她从该列表中选择了一个项目,就会识别出正确的长 ID,并创建一个新对象并通过意图。

但是创建新对象不知何故失败了,因为在接收活动中对象 ReleaseModel 为空

我做错了什么?

创建和传递对象(ReleaseModel):

...
new DialogInterface.OnClickListener() {

    public void onClick(DialogInterface dialog, int item) {
    // Do something with the selection
    for (int i = 0; i < releaseIds.size(); i++) {

    if (i == item) {
       long ID = releaseIds.get(i);
       final ReleaseModel releaseModel = new ReleaseModel(ID);
       ReleaseActivtiy_.intent(MyAppsMain.this).extra("releaseModel",
           releaseModel).start();
        }
       }
      }
});
...

对象本身:

public class ReleaseModel extends BaseModel {

    private List<String> url = new ArrayList<>();
    private boolean liked;
    ...

    public ReleaseModel() {
    }

    public ReleaseModel(long id) {
        super(id);
    }
    ...
    public void writeToParcel(Parcel parcel, int flags) {
        super.writeToParcel(parcel, flags);
        parcel.writeInt(liked ? 1 : 0);
        ...
    }

    public static final Parcelable.Creator<ReleaseModel> CREATOR = new Parcelable.Creator<ReleaseModel>() {
        public ReleaseModel createFromParcel(Parcel in) {
            return new ReleaseModel(in);
        }

        public ReleaseModel[] newArray(int size) {
            return new ReleaseModel[size];
        }
    };

    private ReleaseModel(Parcel parcel) {
        super(parcel);
        setLiked(parcel.readInt() == 1);
        ...
    }
}

基础模型:

public class BaseModel implements Parcelable {

    private long id;
    private long date;
    ...
    public BaseModel() {
    }

    public BaseModel(long id) {
        this.id = id;
    }

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }
    ...
    public void writeToParcel(Parcel parcel, int flags) {
        parcel.writeLong(id);
        parcel.writeLong(date);
        ...
    }

    public static final Parcelable.Creator<BaseModel> CREATOR = new Parcelable.Creator<BaseModel>() {
        public BaseModel createFromParcel(Parcel in) {
            return new BaseModel(in);
        }

        public BaseModel[] newArray(int size) {
            return new BaseModel[size];
        }
    };

    public BaseModel(Parcel parcel) {
        setId(parcel.readLong());
        setDate(parcel.readLong());
        ...
    }
}

接收活动:

@EActivity(R.layout.release_activity)
public class ReleaseActivtiy extends BaseActivity implements LoaderManager
        .LoaderCallbacks<BaseResponse>, NotificationCenter.NotificationCenterDelegate {
...
@Extra("releaseModel")
    ReleaseModel releaseModel;

    @Override
        public void onCreate(Bundle savedInstanceState) {

            super.onCreate(savedInstanceState);
            ...
        }

        @AfterViews
        public void init() {
            // Nullpointer exception on this line for releaseModel
            String temp = releaseModel.getSubject().replaceAll("[^a-zA-Z]", "");
        }
}

【问题讨论】:

    标签: android object android-intent annotations parcelable


    【解决方案1】:

    将 ReleaseModel 对象传递给另一个 Activity(ActivityPassedTo)。 执行以下步骤:

    1.你需要让ReleaseModel实现Serializable

    2.要将其传递给 Intent,您需要有一个唯一键来标识两个活动中传递的对象

    例如。您可以创建一个密钥: static final String RELEASE_MODEL = "RELEASE_MODEL";

    1. 现在将其传递给意图中的活动

      Intent intent = new Intent(this,ActivityPassedTo.class);

      intent.putExtra(RELEASE_MODEL,releaseModelObject);

      startActivity(intent);

    2. 现在检索 Activity 中的对象 (ActivityPassedTo)

      Intent intent = getIntent()

      ReleaseModel releaseModel = (ReleaseModel)intent.getSerializableExtra(RELEASE_MODEL);

    【讨论】:

    • 只是发布模型,所以我可以在接收活动中处理它。 arraylist 只保存标识这些对象的长 ID,但创建新对象 (releasemodel) 失败,因为它在接收活动时为空。
    • @Simon 有帮助吗?
    • 嗨,Gursheesh,我发现了错误,我忘了实际检索链接到对象的数据,因此它为空。它现在有效,但感谢您的努力,非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-30
    • 1970-01-01
    • 2019-09-12
    • 2018-05-23
    • 1970-01-01
    相关资源
    最近更新 更多