我试图使一个数组列表Parcelable,以便传递给一个活动的自定义对象列表。我开始写一个myObjectList类,它扩展了ArrayList<myObject>并实现了Parcelable。
MyObject的一些属性是布尔型的,但是Parcel没有任何读写布尔型的方法。
最好的处理方法是什么?
我试图使一个数组列表Parcelable,以便传递给一个活动的自定义对象列表。我开始写一个myObjectList类,它扩展了ArrayList<myObject>并实现了Parcelable。
MyObject的一些属性是布尔型的,但是Parcel没有任何读写布尔型的方法。
最好的处理方法是什么?
当前回答
如果你使用Android Studio,我建议你使用最简单的方法来实现Parcelable。
简单地去文件->设置->插件->浏览存储库和搜索parcelable .见图片
它会自动创建Parcelable。
有一个网友也在做这件事。http://www.parcelabler.com/
其他回答
对于API 29及以上,我们可以使用
writeToParcel:
dest writeBoolean (booleanFlag);
readFromParcel:
booleanFlag = in.readBoolean()
或者我们可以用
writeToParcel:
dest.writeByte((byte) (booleanFlag ?1: 0));
readFromParcel:
布尔标志 = in.readbyte() != 0;
我通常把它们放在一个数组中,调用writeBooleanArray和readBooleanArray
如果你需要打包一个布尔值,你可以这样做:
parcel.writeBooleanArray(new boolean[] {myBool});
在Android (AOSP)源码中有很多这样的例子。例如,PackageInfo类有一个布尔成员requiredForAllUsers,它被序列化如下:
public void writeToParcel(Parcel dest, int parcelableFlags) {
...
dest.writeInt(requiredForAllUsers ? 1 : 0);
...
}
private PackageInfo(Parcel source) {
...
requiredForAllUsers = source.readInt() != 0;
...
}
在Kotlin中简短而简单的实现,具有可空支持:
为Parcel添加方法
fun Parcel.writeBoolean(flag: Boolean?) {
when(flag) {
true -> writeInt(1)
false -> writeInt(0)
else -> writeInt(-1)
}
}
fun Parcel.readBoolean(): Boolean? {
return when(readInt()) {
1 -> true
0 -> false
else -> null
}
}
并使用它:
parcel.writeBoolean(isUserActive)
parcel.readBoolean() // For true, false, null
parcel.readBoolean()!! // For only true and false
从api 29开始,你现在可以在Parcel类中使用readBoolean()。 详见https://developer.android.com/reference/android/os/Parcel#readBoolean()