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

gru*_*unk 397 android parcelable

我正在尝试制作一个ArrayList Parcelable自定义对象列表的活动.我开始编写一个myObjectList扩展ArrayList<myObject>和实现的类Parcelable.

某些属性MyObjectbooleanParcel没有任何方法read/writeBoolean.

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

b_y*_*yng 929

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

writeToParcel:

dest.writeByte((byte) (myBoolean ? 1 : 0));     //if myBoolean == true, byte == 1
Run Code Online (Sandbox Code Playgroud)

readFromParcel:

myBoolean = in.readByte() != 0;     //myBoolean == true if byte != 0
Run Code Online (Sandbox Code Playgroud)

  • 没有理由使用byte over int.由于强制转换,byte更加冗长:dest.writeInt(myBoolean?1:0); (38认同)
  • @sotrh写一个字节只写一个int:`/***在当前的dataPosition()中将一个字节值写入parcel,*如果需要,增加dataCapacity().*/public final void writeByte(byte val){writeInt(val); }` (12认同)
  • @Dallas是从文档中得到的吗?如果是这样,那么请忽略我的评论.对api来说似乎不诚实,有一个函数说`writeByte`,但实际上写了一个int. (3认同)

Tai*_*aig 65

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

dst.writeValue( myBool );
Run Code Online (Sandbox Code Playgroud)

之后,您可以使用简单的强制转换轻松检索它Boolean:

boolean myBool = (Boolean) source.readValue( null );
Run Code Online (Sandbox Code Playgroud)

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

writeInt( (Boolean) v ? 1 : 0 );
Run Code Online (Sandbox Code Playgroud)

  • 这里编写的代码不会编译.readValue需要一个类加载器,但布尔值不需要它.它应该是"boolean myBool =(Boolean)source.readValue(null);" 审稿人不知道他们在做什么,拒绝我对这个答案的编辑:@hemang,jeeped,DavidRR. (6认同)

Sha*_*aaz 15

你是这样声明的

 private boolean isSelectionRight;
Run Code Online (Sandbox Code Playgroud)

 out.writeInt(isSelectionRight ? 1 : 0);
Run Code Online (Sandbox Code Playgroud)

isSelectionRight  = (in.readInt() == 0) ? false : true;
Run Code Online (Sandbox Code Playgroud)

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

  • 或者只是`isSelectionRight = in.readInt()== 1;`. (7认同)

Hen*_*ijn 12

AndroidStudio(使用2.3个大气压),在你的类上实现Parcelable后,你可以简单地将鼠标指针放在你的类名上,它会要求你添加parcelable实现:

在此输入图像描述

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

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

...
Run Code Online (Sandbox Code Playgroud)


Geo*_*its 8

我通常让他们在一个数组和呼叫writeBooleanArrayreadBooleanArray

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

parcel.writeBooleanArray(new boolean[] {myBool});
Run Code Online (Sandbox Code Playgroud)


小智 8

out.writeInt(mBool ? 1 : 0); //Write
this.mBool =in.readInt()==1; //Read
Run Code Online (Sandbox Code Playgroud)


Xar*_*mer 5

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

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

在此输入图像描述 它会自动创建Parcelable.

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


com*_*m1x 5

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
    }
}
Run Code Online (Sandbox Code Playgroud)

并使用它:

parcel.writeBoolean(isUserActive)

parcel.readBoolean()        // For true, false, null
parcel.readBoolean()!!      // For only true and false
Run Code Online (Sandbox Code Playgroud)