Data binding: set property if it isn't null
Cannot understand... How to set some property of view only if variable field isn't null?
For example
<?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>
Some field of Item can be null and I won't call methods of layout views unnecessarily. And I won't get NullPointerException
. How can I set property only if it isn't null?
P.S. Sorry for English.
Solution 1:
Well data binding avoids NullPointerException in general by checking for it and assigns the default value (null for example) even if item
itself is null in your example.
But a basic example for null checks for the item's properties:
android:text='@{item.title != null ? user.title : ""}'
Or use the "Null Coalescing Operator". The null coalescing operator (??
) chooses the left operand if it is not null or the right if it is null.
android:text='@{item.title ?? ""}'
Note that title
or getTitle
doesn't matter.
Solution 2:
Data binding does not need to check for null value, it will be handled by binding class.
If you need to check null for other purpose (like setting default value) then you can use like this.
android:text='@{item.gender != null ? item.gender : @string/male}'
or
android:text='@{item.gender ?? @string/male}'
Both above examples are same. Here @string/male
is default value, when item.gender
is null
.
Solution 3:
I tried something like this.
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
<import type="android.text.TextUtils"/>
<variable
name="mOrder"
type="com.test.app.models.Order" />
</data>
<TextView
android:id="@+id/mLblSource"
android:layout_width="100dp"
android:layout_height="40dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:text='@{TextUtils.isEmpty(mOrder.order_id) ? "- -" : mOrder.order_id}'
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toBottomOf="parent" />
</layout>