Как читать/писать логическое значение при реализации интерфейса Parcelable?

Я пытаюсь сделать ArrayList Parcelable, чтобы передать в действие список настраиваемого объекта. Я начинаю писать класс myObjectList, который расширяет ArrayList<myObject> и реализует Parcelable.

Некоторые атрибуты MyObject являются boolean, но Parcel не имеют никакого метода read/writeBoolean.

Каков наилучший способ справиться с этим?

Ответы

Ответ 1

Вот как бы я это сделал...

writeToParcel:

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

readFromParcel:

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

Ответ 2

Вы также можете использовать метод writeValue. На мой взгляд, это самое простое решение.

dst.writeValue( myBool );

Впоследствии вы можете легко получить его с простым приведением в Boolean:

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

Под капотом Android Framework будет обрабатывать его как целое число:

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

Ответ 3

вы так заявляете

 private boolean isSelectionRight;

написать

 out.writeInt(isSelectionRight ? 1 : 0);

прочитать

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

boolean type необходимо преобразовать в то, что поддерживает Parcel, и поэтому мы можем преобразовать его в int.

Ответ 4

Я обычно имею их в массиве и вызываю writeBooleanArray и readBooleanArray

Если это одно логическое значение, которое нужно упаковать, вы можете сделать это:

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

Ответ 5

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

Ответ 6

Я предложил вам самый простой способ реализовать Parcelable, если вы используете Android Studio.

Просто перейдите в Файл- > Настройки- > Плагины- > Обзор репозитория и выполните поиск по доступным. Посмотрите изображение

введите описание изображения здесь Он автоматически создаст Parcelable.

И для этого есть веб-сайт. http://www.parcelabler.com/

Ответ 7

Вы можете упаковать ваши логические значения в байты, используя маскировку и перемещение. Это был бы самый эффективный способ сделать это, и, вероятно, это то, что они ожидали бы от вас.

Ответ 8

Трудно определить реальный вопрос здесь. Я предполагаю, что это как обращаться с булевыми при реализации интерфейса Parcelable.

Некоторые атрибуты MyObject являются логическими, но у Parcel нет метода read/writeBoolean.

Вам нужно либо сохранить значение в виде строки, либо в виде байта. Если вы переходите на строку, вам придется использовать статический метод класса String под названием valueOf() для синтаксического анализа логического значения. Это не так эффективно, как сохранение его в байте.

String.valueOf(theBoolean);

Если вы идете на байты, вам придется самостоятельно реализовать логику преобразования.

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

При отключении объекта Parcel вы должны позаботиться о преобразовании в исходный тип.

Ответ 9

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);
}

...

Ответ 10

Этот вопрос уже был отлично отдан другим людям, если вы хотите сделать это самостоятельно.

Если вы предпочитаете инкапсулировать или скрывать большую часть низкоуровневого кода, вы можете использовать часть кода Я написал некоторое время назад для упрощения обработки посылок.

Запись на партию так же просто, как:

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);

Ответ 11

Краткая и простая реализация в 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