Связывание данных: установить свойство, если оно не является нулевым

145
8

Не могу понять... Как установить некоторое свойство представления только в том случае, если переменное поле не равно нулю?
Например

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">

<data>
<variable
name="item"
type="com.test.app.Item" />
</data>

<RelativeLayout
android:layout_width="match_parent"
android:layout_height="60dp"
android:orientation="horizontal">

<ImageView
android:id="@+id/icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_centerVertical="true"
android:layout_margin="16dp"
android:src="@{item.getDrawable()}"/>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginEnd="16dp"
android:layout_marginLeft="72dp"
android:layout_marginRight="16dp"
android:layout_marginStart="72dp"
android:layout_toLeftOf="@id/action"
android:layout_toStartOf="@id/action"
android:orientation="vertical">

<TextView
android:id="@+id/text1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:singleLine="true"
android:textColor="@color/black_87"
android:textSize="16sp"
android:text="@{item.getTitle()}"/>

<TextView
android:id="@+id/text2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:autoLink="web|email"
android:linksClickable="false"
android:singleLine="true"
android:textColor="@color/black_54"
android:textSize="14sp"
android:text="@{item.getSubtitle()}"/>

</LinearLayout>

</RelativeLayout>
</layout>

Некоторое поле элемента может быть нулевым, и я не буду обращаться к методам макетов без необходимости. И я не получу NullPointerException. Как установить свойство только в том случае, если оно не является нулевым?
PS Извините за английский.

спросил(а) 2021-01-25T17:44:42+03:00 5 месяцев назад
1
Решение
279

Связывание данных Well исключает NullPointerException в целом, проверяя его и присваивая значение по умолчанию (например, null), даже если item сам по себе является нулевым в вашем примере.

Но базовый пример для нулевых проверок свойств элемента:

android:text='@{item.title != null ? user.title : ""}'

Или используйте "Null Coalescing Operator". Оператор нулевой коалесценции (??) выбирает левый операнд, если он не является нулевым или правильным, если он равен нулю.

android:text='@{item.title ?? ""}'

Обратите внимание, что title или getTitle не имеет значения.

ответил(а) 2021-01-25T17:44:42+03:00 5 месяцев назад
45

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

Если вам нужно проверить null для других целей (например, установить значение по умолчанию), вы можете использовать это.

android:text='@{item.gender != null ? item.gender : @string/male}'

или

android:text='@{item.gender ?? @string/male}'

Оба примера выше одинаковы.

ответил(а) 2021-01-25T17:44:42+03:00 5 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема