android - 我在这个 Parcelable 类中做错了什么?

标签 android parcelable

我正在尝试启动一个新的 Activity 并将自定义 Parcelable 对象添加到 Intent 中。 显然这不起作用:

类(class):

public class TestObject implements Parcelable{

private String mString;
private int mInt;
private List<String> mList;



public TestObject() {
    this.mString = "This is a String";
    this.mInt = 777;
    mList = new ArrayList<String>();
    for(int i=0; i<100; i++){
        mList.add(String.valueOf(i));
    }
}




public TestObject(Parcel in) {
    setmInt(in.readInt());
    setmString(in.readString());
    mList = new ArrayList<String>();
    in.readStringList(mList);

}


public void setmString(String mString) {
    this.mString = mString;
}



public void setmInt(int mInt) {
    this.mInt = mInt;
}


public String getmString() {
    return mString;
}




public int getmInt() {
    return mInt;
}


@Override
public int describeContents() {
    // TODO Auto-generated method stub
    return 0;
}






@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeString(mString);
    dest.writeInt(mInt);
    dest.writeStringList(mList);

}

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

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

}

第一个 Activity :

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    TestObject object = new TestObject();
    Intent i = new Intent(this, SecondActivity.class);
    Debug.startMethodTracing("parcelable");
    i.putExtra("object", object);
    startActivity(i);
}

第二个 Activity :

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Intent i = getIntent();
    TestObject ob = (TestObject) i.getParcelableExtra("object");
    Debug.stopMethodTracing();
    Log.d("object string", "string: " + ob.getmString());

}

问题出在 List<String> ...

最佳答案

问题在于您将变量写入 Parcel 的顺序与读取变量的顺序不同。你先写mString,但先读mInt。这将起作用:

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeString(mString);
    dest.writeInt(mInt);
    dest.writeStringList(mList);
}

public TestObject(Parcel in) {
    setmString(in.readString());
    setmInt(in.readInt());
    mList = new ArrayList<String>();
    in.readStringList(mList);
}

顺便说一句,不要为 CREATOR 使用原始类型,而是使用它:

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

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

关于android - 我在这个 Parcelable 类中做错了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16195163/

相关文章:

Android Service不启动也能绑定(bind)?

android - Parcelables 不支持默认值。 Android 导航深层链接参数

java - 创建新的可打包对象的正确方法

java - 从 Bundle 接收 null Parcelable 对象

android - 在 Windows 中将 $ANDROID_HOME/tools 添加到 $Path

android - 无法为我的 ListView 更新数据

java - 可热完成长时间运行的任务

带有imageview的可点击布局的android选择器

android - 实现 Parcelable 的正确方法

android - 如何将 Android Parcelable 数组保存到文件中?