实现Parcelable接口时如何读/写布尔值?

时间:2011-06-01 12:42:11

标签: android parcelable

我正在尝试制作ArrayList Parcelable,以便将自定义对象列表传递给活动。我开始编写一个myObjectList类,扩展ArrayList<myObject>并实现Parcelable

MyObject的某些属性为boolean,但Parcel没有任何方法read/writeBoolean

处理此问题的最佳方法是什么?

13 个答案:

答案 0 :(得分:922)

我是怎么做的......

writeToParcel:

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

readFromParcel:

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

答案 1 :(得分:65)

您还可以使用writeValue方法。在我看来,这是最直接的解决方案。

dst.writeValue( myBool );

之后,您可以通过简单的演员转换到Boolean

轻松检索它
boolean myBool = (Boolean) source.readValue( null );

在幕后,Android框架将把它作为一个整数来处理:

writeInt( (Boolean) v ? 1 : 0 );

答案 2 :(得分:15)

你宣布像这样

 private boolean isSelectionRight;

 out.writeInt(isSelectionRight ? 1 : 0);

isSelectionRight  = (in.readInt() == 0) ? false : true;

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

答案 3 :(得分:9)

AndroidStudio(使用2.3个大气压),在您的课程中实施Parcelable后,您只需将鼠标指针悬停在类名上,它就会要求您添加parcelable实现:

enter image description here

从四个字段中,它会生成以下内容:

public class YourClass implements Parcelable{

String someString;
int someInt;
boolean someBoolean;
List<String> someList;

protected YourClass(Parcel in) {
    someString = in.readString();
    someInt = in.readInt();
    someBoolean = in.readByte() != 0;
    someList = in.createStringArrayList();
}

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeString(someString);
    dest.writeInt(someInt);
    dest.writeByte((byte) (someBoolean ? 1 : 0));
    dest.writeStringList(someList);
}

...

答案 4 :(得分:8)

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

答案 5 :(得分:7)

我通常将它们放在一个数组中并致电writeBooleanArrayreadBooleanArray

如果它是一个需要打包的布尔值,你可以这样做:

parcel.writeBooleanArray(new boolean[] {myBool});

答案 6 :(得分:5)

  

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

只需转到文件 - >设置 - >插件 - &gt;浏览存储库并搜索parcelable。查看图片

enter image description here 它会自动创建Parcelable。

还有一个网站也是这样做的。 http://www.parcelabler.com/

答案 7 :(得分:4)

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

答案 8 :(得分:3)

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

答案 9 :(得分:3)

这里很难确定真正的问题。我想这是在实现Parcelable接口时如何处理布尔值。

  

MyObject的某些属性是布尔值,但Parcel没有任何方法read / writeBoolean。

您必须将值存储为字符串或字节。如果你去找一个字符串,那么你将不得不使用名为String的{​​{1}}类的静态方法来解析布尔值。它不如保存在一个字节中那么有效。

valueOf()

如果你去一个字节,你必须自己实现转换逻辑。

String.valueOf(theBoolean);

在解组byte convBool = -1; if (theBoolean) { convBool = 1; } else { convBool = 0; } 对象时,您必须处理转换为原始类型。

答案 10 :(得分:1)

如果你想独自完成这个问题,其他人已经完全回答了这个问题。

如果您希望封装或隐藏大部分低级别的parceling代码,可以考虑使用some of the code I wrote some time ago for simplifying handling of parcelables.

写入包裹就像以下一样简单:

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

其中color是枚举,isDriving是布尔值,例如。

从包裹中读取也不难:

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

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

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

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

答案 11 :(得分:0)

Android(AOSP)来源中有很多例子。例如,PackageInfo类有一个布尔成员requiredForAllUsers,它按如下方式序列化:

public void writeToParcel(Parcel dest, int parcelableFlags) {
    ...
    dest.writeInt(requiredForAllUsers ? 1 : 0);
    ...
}

private PackageInfo(Parcel source) {
    ...
    requiredForAllUsers = source.readInt() != 0;
    ...
}

答案 12 :(得分:0)

<块引用>

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

writeToParcel:

dest.writeBoolean(booleanFlag);

readFromParcel:

booleanFlag = in.readBoolean()

<块引用>

或者我们可以使用

writeToParcel:

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

从包裹中读取:

booleanFlag = in.readByte() != 0;