И назовите это так:

аюсь устранить все предупреждения моего Android-приложения, и одно из них таково:

viewModel.value - это поле в штучной упаковке, но оно должно быть распаковано для запуска android: флажок. Это может вызвать NPE, поэтому Data Binding безопасно распакует его. Вы можете изменить выражение и явно обернуть viewModel.value с safeUnbox (), чтобы предотвратить предупреждение

Где значение является общимObservableField это происходит из супер класса:

public abstract class BaseDataTypeViewModel<T> extends BaseObservable  {
    public final ObservableField<T> value = new ObservableField<>();
    ...
}

И распространяется где-то какBoolean:

public class CheckBooleanDataTypeViewModel extends BaseDataTypeViewModel<Boolean> {
    ...
}

Я видел напривязка данных - предупреждение safeUnbox что предупреждения случаются, потому что этоBoolean и неbooleanпоэтому я попытался добавить это:android:checked="@={safeUnbox(viewModel.value)}" вместоandroid:checked="@={viewModel.value}" но тогда я получил сообщение о том, что не могу инвертироватьsafeUnbox() метод.

**** / ошибка связывания данных. какой метод следует использовать при использовании его в выражениях двустороннего связывания

Я правильно понимаю две раздельные проблемы, но должен ли я жить с предупреждением, чтобы избежать ошибки, или это решение, позволяющее избежать как предупреждения, так и ошибки? Что насчет@InverseMethod речь идет? Мне не удалось добавить эту аннотацию, потому что метод происходит из пакета Android.

Ответы на вопрос(2)

ежать этого предупреждения, создавBindingAdapter для типа в штучной упаковке, как это:

@BindingAdapter("android:checked")
public static void setChecked(CompoundButton checkableView, Boolean isChecked) {
    checkableView.setChecked(isChecked != null ? isChecked : false);
}

Это решение может быть реплицировано на любое свойство, какvisibility, enabled и т. д. и к любому коробочному примитиву, какInteger, Float и т.п.

Вы также можете указать значение, которое будет использоваться в случае, если вашLiveData значениеnull нравится:

@BindingAdapter(value={"android:checked", "nullValue"}, requireAll=false)
public static void setChecked(CompoundButton checkableView, Boolean isChecked, boolean nullValue) {
    checkableView.setChecked(isChecked != null ? isChecked : nullValue);
}

И назовите это так:

<CheckBox
    ...
    android:checked='@{viewModel.value}'
    app:nullValue="@{false}"
    />
Решение Вопроса

вязки данных таким конкретным способом, но думаю, что смогу помочь.

В вашем XML у вас есть это:

android:checked="@={viewModel.value}"

Система дает вам предупреждение, потому что она хочет, чтобы вы знали, что в случае, когдаviewModel.value являетсяnull, он собирается сделать что-то особенное (вести себя так, как будто это былоfalse вместо этого, предположительно). Это делается черезsafeUnbox() метод.

Чтобы решить предупреждение, предлагается сделатьsafeUnbox() вызов явный. Вы не можете сделать это, потому что нет "обратного"safeUnbox() идтиназад изboolean вBoolean.

Но это не похоже на то, что вы должны использоватьsafeUnbox(); Вы можете создать свой собственный метод, который преобразуетBoolean вboolean, а затем вы можете использовать предложенную аннотацию, чтобы объявить, какой метод будет преобразован обратноboolean вBoolean.

public class MyConversions {

    @InverseMethod("myBox")
    public static boolean myUnbox(Boolean b) {
        return (b != null) && b.booleanValue();
    }

    public static Boolean myBox(boolean b) {
        return b ? Boolean.TRUE : Boolean.FALSE;
    }
}

Теперь вы можете изменить свой XML на:

android:checked="@={com.example.stackoverflow.MyConversions.myUnbox(viewModel.value)}"

Надеюсь, это поможет. Если окажется, что я далеко за пределами базы, дайте мне знать; Я хотел бы узнать больше об этой теме.

Большую часть того, что я получил в этом ответе, я узнал отhttps://medium.com/google-developers/android-data-binding-inverse-functions-95aab4b11873

 MHogge17 нояб. 2017 г., 10:11
Вы хорошо поняли проблему! Хороший способ решить это. Чтобы быть чище, я импортировал «com.example ...» в<import> тег.
 Pasi Matalamäki22 авг. 2018 г., 16:25
Спасибо за это! Я создал класс, содержащий отображения для всех типов примитивов Java.gist.github.com/pasmat/f1f8f04eeab4dde7dc9b534a51f67d15
 nilsi18 окт. 2018 г., 18:06
Я пробовал это, но получал исключение нулевого указателя при выполнении liveata.getValue () в моем ViewModel после изменения моего флажка. Я вижу, что он запускает методы бокса, если я ставлю точки останова и предупреждения исчезают. Есть идеи, что может быть не так?

Ваш ответ на вопрос