我正在尝试制作 ArrayList Parcelable ,以便将自定义对象列表传递给活动 . 我开始编写 myObjectList 类,扩展 ArrayList<myObject> 并实现 Parcelable .
ArrayList
Parcelable
myObjectList
ArrayList<myObject>
MyObject 的某些属性是 boolean 但 Parcel 没有任何方法 read/writeBoolean .
MyObject
boolean
Parcel
read/writeBoolean
处理这个问题的最佳方法是什么?
这是我怎么做的......
writeToParcel:
dest.writeByte((byte) (myBoolean ? 1 : 0)); //if myBoolean == true, byte == 1
readFromParcel:
myBoolean = in.readByte() != 0; //myBoolean == true if byte != 0
您还可以使用writeValue方法 . 在我看来,这是最直接的解决方案 .
dst.writeValue( myBool );
之后,您可以通过简单的强制转换将其轻松检索到 Boolean :
Boolean
boolean myBool = (Boolean) source.readValue( null );
在幕后,Android Framework将它作为整数处理:
writeInt( (Boolean) v ? 1 : 0 );
你是这样声明的
private boolean isSelectionRight;
写
out.writeInt(isSelectionRight ? 1 : 0);
读
isSelectionRight = (in.readInt() == 0) ? false : true;
布尔类型需要转换为Parcel支持的东西,因此我们可以将其转换为int .
out.writeInt(mBool ? 1 : 0); //Write this.mBool =in.readInt()==1; //Read
我通常将它们放在一个数组中并调用 writeBooleanArray 和 readBooleanArray
writeBooleanArray
readBooleanArray
如果它是一个需要打包的布尔值,你可以这样做:
parcel.writeBooleanArray(new boolean[] {myBool});
AndroidStudio(使用2.3个大气压),在你的类上实现Parcelable后,你可以简单地将鼠标指针放在 class name 上,它会要求你添加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); } ...
如果您使用的是Android Studio,我建议您使用Parcelable实现最简单的方法 .
只需转到 File->Settings->Plugins->Browse Repository 并搜索parcelable . 查看图像
它会自动创建Parcelable .
还有一个网站也是这样做的 . http://www.parcelabler.com/
您可以使用屏蔽和移位将布尔值打包到一个字节中 . 这将是最有效的方式,并且可能是他们期望你做的 .
这里很难确定真正的问题 . 我想这是在实现 Parcelable 接口时如何处理布尔值 .
MyObject的某些属性是布尔值,但Parcel没有任何方法read / writeBoolean .
您必须将值存储为字符串或字节 . 如果你去一个字符串,那么你将不得不使用名为 valueOf() 的 String 类的静态方法来解析布尔值 . 它没有像在一个字节中保存它那样有效 .
valueOf()
String
String.valueOf(theBoolean);
如果你去一个字节,你必须自己实现转换逻辑 .
byte convBool = -1; if (theBoolean) { convBool = 1; } else { convBool = 0; }
解组 Parcel 对象时,必须注意转换为原始类型 .
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
如果你想自己做这个问题,其他人已经完全回答了这个问题 .
如果您希望封装或隐藏大多数低级别的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);
Android(AOSP)源中有很多示例 . 例如, PackageInfo 类有一个布尔成员 requiredForAllUsers ,它按如下方式序列化:
PackageInfo
requiredForAllUsers
public void writeToParcel(Parcel dest, int parcelableFlags) { ... dest.writeInt(requiredForAllUsers ? 1 : 0); ... } private PackageInfo(Parcel source) { ... requiredForAllUsers = source.readInt() != 0; ... }
12 回答
这是我怎么做的......
writeToParcel:
readFromParcel:
您还可以使用writeValue方法 . 在我看来,这是最直接的解决方案 .
之后,您可以通过简单的强制转换将其轻松检索到
Boolean
:在幕后,Android Framework将它作为整数处理:
你是这样声明的
写
读
布尔类型需要转换为Parcel支持的东西,因此我们可以将其转换为int .
我通常将它们放在一个数组中并调用
writeBooleanArray
和readBooleanArray
如果它是一个需要打包的布尔值,你可以这样做:
AndroidStudio(使用2.3个大气压),在你的类上实现Parcelable后,你可以简单地将鼠标指针放在 class name 上,它会要求你添加parcelable实现:
从这四个字段中,它生成以下内容:
只需转到 File->Settings->Plugins->Browse Repository 并搜索parcelable . 查看图像
它会自动创建Parcelable .
还有一个网站也是这样做的 . http://www.parcelabler.com/
您可以使用屏蔽和移位将布尔值打包到一个字节中 . 这将是最有效的方式,并且可能是他们期望你做的 .
这里很难确定真正的问题 . 我想这是在实现
Parcelable
接口时如何处理布尔值 .您必须将值存储为字符串或字节 . 如果你去一个字符串,那么你将不得不使用名为
valueOf()
的String
类的静态方法来解析布尔值 . 它没有像在一个字节中保存它那样有效 .如果你去一个字节,你必须自己实现转换逻辑 .
解组
Parcel
对象时,必须注意转换为原始类型 .Kotlin 中的简短实现,具有可空支持:
向Parcel添加方法
并使用它:
如果你想自己做这个问题,其他人已经完全回答了这个问题 .
如果您希望封装或隐藏大多数低级别的parceling代码,可以考虑使用some of the code I wrote some time ago for simplifying handling of parcelables.
写入包裹就像以下一样简单:
例如,color是一个枚举,而isDriving是一个布尔值 .
从包裹中读取也不难:
只需看看我添加到项目中的“ParceldroidExample” .
最后,它还使CREATOR初始化器保持简短:
Android(AOSP)源中有很多示例 . 例如,
PackageInfo
类有一个布尔成员requiredForAllUsers
,它按如下方式序列化: