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

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

最好的处理方法是什么?


当前回答

你这样声明

 private boolean isSelectionRight;

 out.writeInt(isSelectionRight ? 1 : 0);

read

isSelectionRight  = in.readInt() != 0;

布尔类型需要转换为Parcel支持的东西,所以我们可以将它转换为int。

其他回答

在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()

如果你使用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;