Оператор связывания данных Android - нулевой оператор объединения
Я пытаюсь использовать оператор объединения нулей в привязке данных. У меня есть составное рисование, для которого мне нужно показать одну из трех нарисованных иконок, в зависимости от того, является ли переменная пустым, истинным или ложным.
XML
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<import type="android.view.View" />
<variable
name="dataModel"
type="com.my.app.MyDataModel" />
</data>
<TextView
android:id="@id/mCompoundDrawable"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:drawableRight="@{(dataModel.isSelected ? @drawable/selected : @drawable/not_selected) ?? @drawable/not_specified }"
android:focusable="true"
android:gravity="center_vertical"
android:scrollHorizontally="false"
android:text="@{dataModel.text}" />
</layout>
Модель данных
public class MyDataModel
{
public String text;
public Boolean isSelected;
public MyDataModel(String text, Boolean isSelected)
{
this.text = text;
this.isSelected = isSelected;
}
}
Я вызываю это, звоня:
MyDataModel dataModel = new MyDataModel(text, null);
binding.setDataModel(dataModel);
я думал так
android:drawableRight="@{(dataModel.isSelected ? @drawable/selected : @drawable/not_selected) ?? @drawable/not_specified }
эффективно так же, как:
android:drawableRight="@{dataModel.isSelected != null? (dataModel.isSelected ? @drawable/selected : @drawable/not_selected) : @drawable/not_specified }
Тем не менее, я получаю следующее исключение во время выполнения:java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.Boolean.booleanValue()' on a null object reference
Мне интересно, как я могу преодолеть эту ошибку. Спасибо!
1 ответ
(1) (dataModel.isSelected ? @drawable/selected : @drawable/not_selected) ?? @drawable/not_specified
это не то же самое, что
(2) dataModel.isSelected != null ? (dataModel.isSelected ? @drawable/selected : @drawable/not_selected) : @drawable/not_specified
В первом выражении вы получите ошибку, потому что оператор ?:
звонки dataModel.isSelected.booleanValue()
неявно на null
указатель.
В любом случае, я считаю, что в этом случае нельзя использовать оператор объединения нулей, поэтому я бы просто использовал второе выражение.