首页 文章

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

提问于
浏览
370

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

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

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

12 回答

  • 0

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

    writeToParcel:

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

    readFromParcel:

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

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

    dst.writeValue( myBool );
    

    之后,您可以通过简单的强制转换将其轻松检索到 Boolean

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

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

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

    你是这样声明的

    private boolean isSelectionRight;
    

    out.writeInt(isSelectionRight ? 1 : 0);
    

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

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

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

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

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

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

    AndroidStudio(使用2.3个大气压),在你的类上实现Parcelable后,你可以简单地将鼠标指针放在 class name 上,它会要求你添加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);
    }
    
    ...
    
  • 3

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

    只需转到 File->Settings->Plugins->Browse Repository 并搜索parcelable . 查看图像

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

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

  • 0

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

  • 888

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

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

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

    String.valueOf(theBoolean);
    

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

    byte convBool = -1;
    if (theBoolean) {
        convBool = 1;
    } else {
        convBool = 0;
    }
    

    解组 Parcel 对象时,必须注意转换为原始类型 .

  • 15

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

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

    如果您希望封装或隐藏大多数低级别的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);
    
  • 3

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

    public void writeToParcel(Parcel dest, int parcelableFlags) {
        ...
        dest.writeInt(requiredForAllUsers ? 1 : 0);
        ...
    }
    
    private PackageInfo(Parcel source) {
        ...
        requiredForAllUsers = source.readInt() != 0;
        ...
    }
    

相关问题