我试图使一个数组列表Parcelable,以便传递给一个活动的自定义对象列表。我开始写一个myObjectList类,它扩展了ArrayList<myObject>并实现了Parcelable。

MyObject的一些属性是布尔型的,但是Parcel没有任何读写布尔型的方法。

最好的处理方法是什么?


当前回答

如果你使用Android Studio,我建议你使用最简单的方法来实现Parcelable。

简单地去文件->设置->插件->浏览存储库和搜索parcelable .见图片

它会自动创建Parcelable。

有一个网友也在做这件事。http://www.parcelabler.com/

其他回答

我是这么做的……

writeToParcel:

dest.writeByte((byte) (myBoolean ? 1 : 0));     //if myBoolean == true, byte == 1

readFromParcel:

myBoolean = in.readByte() != 0;     //myBoolean == true if byte != 0

您可以使用屏蔽和移位将布尔值打包到一个字节中。这是最有效的方法,也可能是他们希望你做的。

对于API 29及以上,我们可以使用

writeToParcel:

dest writeBoolean (booleanFlag);

readFromParcel:

booleanFlag = in.readBoolean()

或者我们可以用

writeToParcel:

dest.writeByte((byte) (booleanFlag ?1: 0));

readFromParcel:

布尔标志 = in.readbyte() != 0;

out.writeInt(mBool ? 1 : 0); //Write
this.mBool =in.readInt()==1; //Read

这个问题已经被其他人完美地回答了,如果你想自己做的话。

如果您更喜欢封装或隐藏大部分低级的打包代码,那么您可以考虑使用我在不久前编写的一些代码来简化对parcelables的处理。

给包裹写信很简单:

parcelValues(dest, name, maxSpeed, weight, wheels, color, isDriving);

例如,其中color是enum, isDriving是boolean。

从包裹中阅读也不难:

color = (CarColor)unparcelValue(CarColor.class.getClassLoader());
isDriving = (Boolean)unparcelValue();

看看我添加到项目中的“parceldroideexample”。

最后,它还使CREATOR初始化项保持简短:

public static final Parcelable.Creator<Car> CREATOR =
    Parceldroid.getCreatorForClass(Car.class);