Denis Steinman
Denis Steinman

Reputation: 7799

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.

Upvotes: 65

Views: 71294

Answers (4)

sajid Shaikh
sajid Shaikh

Reputation: 21

<import type="android.view.View"/>
android:visibility="@{UserDetails == null ? View.INVISIBLE : View.VISIBLE}"

Import View first

Upvotes: 0

Ahamed Mujeeb
Ahamed Mujeeb

Reputation: 723

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>

Upvotes: 8

Khemraj Sharma
Khemraj Sharma

Reputation: 58934

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.

Upvotes: 26

Mattias Isegran Bergander
Mattias Isegran Bergander

Reputation: 11909

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.

Upvotes: 195

Related Questions