我试图使一个数组列表Parcelable,以便传递给一个活动的自定义对象列表。我开始写一个myObjectList类,它扩展了ArrayList<myObject>并实现了Parcelable。
MyObject的一些属性是布尔型的,但是Parcel没有任何读写布尔型的方法。
最好的处理方法是什么?
我试图使一个数组列表Parcelable,以便传递给一个活动的自定义对象列表。我开始写一个myObjectList类,它扩展了ArrayList<myObject>并实现了Parcelable。
MyObject的一些属性是布尔型的,但是Parcel没有任何读写布尔型的方法。
最好的处理方法是什么?
当前回答
在Android (AOSP)源码中有很多这样的例子。例如,PackageInfo类有一个布尔成员requiredForAllUsers,它被序列化如下:
public void writeToParcel(Parcel dest, int parcelableFlags) {
...
dest.writeInt(requiredForAllUsers ? 1 : 0);
...
}
private PackageInfo(Parcel source) {
...
requiredForAllUsers = source.readInt() != 0;
...
}
其他回答
您可以使用屏蔽和移位将布尔值打包到一个字节中。这是最有效的方法,也可能是他们希望你做的。
这里很难找出真正的问题。我猜是在实现Parcelable接口时如何处理布尔值。
MyObject的一些属性是布尔型的,但是Parcel没有任何读写布尔型的方法。
您必须将值存储为字符串或字节。如果你想要一个字符串,那么你必须使用string类的静态方法valueOf()来解析布尔值。它不像保存在字节坚韧中那样有效。
String.valueOf(theBoolean);
如果你想要一个字节,你必须自己实现一个转换逻辑。
byte convBool = -1;
if (theBoolean) {
convBool = 1;
} else {
convBool = 0;
}
在解编组Parcel对象时,必须注意到原始类型的转换。
我通常把它们放在一个数组中,调用writeBooleanArray和readBooleanArray
如果你需要打包一个布尔值,你可以这样做:
parcel.writeBooleanArray(new boolean[] {myBool});
对于API 29及以上,我们可以使用
writeToParcel:
dest writeBoolean (booleanFlag);
readFromParcel:
booleanFlag = in.readBoolean()
或者我们可以用
writeToParcel:
dest.writeByte((byte) (booleanFlag ?1: 0));
readFromParcel:
布尔标志 = in.readbyte() != 0;
我是这么做的……
writeToParcel:
dest.writeByte((byte) (myBoolean ? 1 : 0)); //if myBoolean == true, byte == 1
readFromParcel:
myBoolean = in.readByte() != 0; //myBoolean == true if byte != 0