我正在尝试制作ArrayList
Parcelable
,以便将自定义对象列表传递给活动。我开始编写一个myObjectList
类,扩展ArrayList<myObject>
并实现Parcelable
。
MyObject
的某些属性为boolean
,但Parcel
没有任何方法read/writeBoolean
。
处理此问题的最佳方法是什么?
答案 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实现:
从四个字段中,它会生成以下内容:
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)
我通常将它们放在一个数组中并致电writeBooleanArray
和readBooleanArray
如果它是一个需要打包的布尔值,你可以这样做:
parcel.writeBooleanArray(new boolean[] {myBool});
答案 6 :(得分:5)
如果您使用的是Android Studio,我建议您使用Parcelable实现最简单的方法。
只需转到文件 - >设置 - >插件 - &gt;浏览存储库并搜索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;