Ответ 1
Вот как бы я это сделал...
writeToParcel:
dest.writeByte((byte) (myBoolean ? 1 : 0)); //if myBoolean == true, byte == 1
readFromParcel:
myBoolean = in.readByte() != 0; //myBoolean == true if byte != 0
Я пытаюсь сделать ArrayList
Parcelable
, чтобы передать в действие список настраиваемого объекта. Я начинаю писать класс myObjectList
, который расширяет ArrayList<myObject>
и реализует Parcelable
.
Некоторые атрибуты 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 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;
boolean type необходимо преобразовать в то, что поддерживает Parcel, и поэтому мы можем преобразовать его в int.
Я обычно имею их в массиве и вызываю writeBooleanArray
и readBooleanArray
Если это одно логическое значение, которое нужно упаковать, вы можете сделать это:
parcel.writeBooleanArray(new boolean[] {myBool});
out.writeInt(mBool ? 1 : 0); //Write
this.mBool =in.readInt()==1; //Read
Я предложил вам самый простой способ реализовать Parcelable, если вы используете Android Studio.
Просто перейдите в Файл- > Настройки- > Плагины- > Обзор репозитория и выполните поиск по доступным. Посмотрите изображение
Он автоматически создаст Parcelable.
И для этого есть веб-сайт. http://www.parcelabler.com/
Вы можете упаковать ваши логические значения в байты, используя маскировку и перемещение. Это был бы самый эффективный способ сделать это, и, вероятно, это то, что они ожидали бы от вас.
Трудно определить реальный вопрос здесь. Я предполагаю, что это как обращаться с булевыми при реализации интерфейса Parcelable
.
Некоторые атрибуты MyObject являются логическими, но у Parcel нет метода read/writeBoolean.
Вам нужно либо сохранить значение в виде строки, либо в виде байта. Если вы переходите на строку, вам придется использовать статический метод класса String
под названием valueOf()
для синтаксического анализа логического значения. Это не так эффективно, как сохранение его в байте.
String.valueOf(theBoolean);
Если вы идете на байты, вам придется самостоятельно реализовать логику преобразования.
byte convBool = -1;
if (theBoolean) {
convBool = 1;
} else {
convBool = 0;
}
При отключении объекта Parcel
вы должны позаботиться о преобразовании в исходный тип.
AndroidStudio (с использованием 2,3 atm), после реализации 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);
}
...
Этот вопрос уже был отлично отдан другим людям, если вы хотите сделать это самостоятельно.
Если вы предпочитаете инкапсулировать или скрывать большую часть низкоуровневого кода, вы можете использовать часть кода Я написал некоторое время назад для упрощения обработки посылок.
Запись на партию так же просто, как:
parcelValues(dest, name, maxSpeed, weight, wheels, color, isDriving);
где цвет - это перечисление, а isDriving - булев, например.
Чтение с посылки также не намного сложнее:
color = (CarColor)unparcelValue(CarColor.class.getClassLoader());
isDriving = (Boolean)unparcelValue();
Просто взгляните на "ParceldroidExample", который я добавил в проект.
Наконец, он также сохраняет инициализатор CREATOR коротким:
public static final Parcelable.Creator<Car> CREATOR =
Parceldroid.getCreatorForClass(Car.class);
Краткая и простая реализация в Kotlin с поддержкой с возможностью NULL:
Добавить методы в партию
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