我试图使一个数组列表Parcelable,以便传递给一个活动的自定义对象列表。我开始写一个myObjectList类,它扩展了ArrayList<myObject>并实现了Parcelable。
MyObject的一些属性是布尔型的,但是Parcel没有任何读写布尔型的方法。
最好的处理方法是什么?
我试图使一个数组列表Parcelable,以便传递给一个活动的自定义对象列表。我开始写一个myObjectList类,它扩展了ArrayList<myObject>并实现了Parcelable。
MyObject的一些属性是布尔型的,但是Parcel没有任何读写布尔型的方法。
最好的处理方法是什么?
当前回答
在Android (AOSP)源码中有很多这样的例子。例如,PackageInfo类有一个布尔成员requiredForAllUsers,它被序列化如下:
public void writeToParcel(Parcel dest, int parcelableFlags) {
...
dest.writeInt(requiredForAllUsers ? 1 : 0);
...
}
private PackageInfo(Parcel source) {
...
requiredForAllUsers = source.readInt() != 0;
...
}
其他回答
您还可以使用writeValue方法。在我看来,这是最直接的解决办法。
dst.writeValue( myBool );
然后,你可以很容易地检索它与一个简单的转换为布尔:
boolean myBool = (Boolean) source.readValue( null );
实际上,Android框架会把它作为一个整数来处理:
writeInt( (Boolean) v ? 1 : 0 );
我是这么做的……
writeToParcel:
dest.writeByte((byte) (myBoolean ? 1 : 0)); //if myBoolean == true, byte == 1
readFromParcel:
myBoolean = in.readByte() != 0; //myBoolean == true if byte != 0
AndroidStudio(使用2.3 atm),在你的类上实现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);
}
...
如果你使用Android Studio,我建议你使用最简单的方法来实现Parcelable。
简单地去文件->设置->插件->浏览存储库和搜索parcelable .见图片
它会自动创建Parcelable。
有一个网友也在做这件事。http://www.parcelabler.com/
我通常把它们放在一个数组中,调用writeBooleanArray和readBooleanArray
如果你需要打包一个布尔值,你可以这样做:
parcel.writeBooleanArray(new boolean[] {myBool});