2016-11-24 1 views
2

Я пытаюсь использовать оператор нулевой коалесценции в привязке данных. У меня есть составной вариант, который должен показать один из трех доступных значков, в зависимости от того, является ли переменная нулевой, истинной или ложной.Оператор привязки данных для привязки данных 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

мне интересно, как я могу преодолеть эту ошибку. Благодаря!

ответ

0

(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 указатель.

В любом случае, я считаю, что в этом случае вы не можете использовать нулевой оператор коалесцирования, поэтому я бы просто использовал второе выражение.

+0

Второе выражение также вызывает исключение нулевого указателя – Vinnie

Смежные вопросы