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

问题描述 投票:388回答:12

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

MyObject的一些属性是booleanParcel没有任何方法read/writeBoolean

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

android parcelable
12个回答
921
投票

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

writeToParcel:

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

readFromParcel:

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

3
投票

这里很难确定真正的问题。我想这是在实现parcel.writeBoolean(isUserActive) parcel.readBoolean() // For true, false, null parcel.readBoolean()!! // For only true and false 界面时如何处理布尔值。

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

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

valueOf()

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

String.valueOf(theBoolean);

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


1
投票

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

如果您希望封装或隐藏大部分低级别的parceling代码,可以考虑使用Parcel

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

some of the code I wrote some time ago for simplifying handling of parcelables.

例如,color是一个枚举,而isDriving是一个布尔值。

从包裹中读取也不难:

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

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

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

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

0
投票

Android(AOSP)源中有很多示例。例如,public static final Parcelable.Creator<Car> CREATOR = Parceldroid.getCreatorForClass(Car.class); 类有一个布尔成员PackageInfo,它按如下方式序列化:

requiredForAllUsers

65
投票

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

dst.writeValue( myBool );

之后,您可以通过简单的演员阵容轻松地将其检索到Boolean

boolean myBool = (Boolean) source.readValue( null );

在幕后,Android Framework将它作为整数处理:

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

15
投票

你是这样声明的

 private boolean isSelectionRight;

 out.writeInt(isSelectionRight ? 1 : 0);

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

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


9
投票

Android Studio(使用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);
}

...

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

7
投票

我通常将它们放在一个数组中并调用writeBooleanArrayreadBooleanArray

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

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

5
投票

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

只需转到文件 - >设置 - >插件 - >浏览存储库,然后搜索parcelable。查看图像

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

还有一个网站也可以这样做。 qazxsw poi


4
投票

在Kotlin中实现简短的实现,具有可空的支持:

向Parcel添加方法

http://www.parcelabler.com/

并使用它:

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
    }
}

3
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.