web-dev-qa-db-ja.com

データバインディング:プロパティがnullでない場合は設定します

理解できません...変数フィールドがnullでない場合にのみ、ビューのプロパティを設定する方法は?
例えば

<?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>

Itemの一部のフィールドはnullにでき、レイアウトビューのメソッドを不必要に呼び出すことはありません。そして、NullPointerExceptionを取得しません。 nullでない場合にのみプロパティを設定するにはどうすればよいですか?
PS英語でごめんなさい。

19
Шах

データバインディングは、一般的にNullPointerExceptionをチェックして回避し、例でitem自体がnullであってもデフォルト値(たとえばnull)を割り当てます。

しかし、アイテムのプロパティのnullチェックの基本的な例:

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

または、「Null Coalescing Operator」を使用します。 null合体演算子(??)nullでない場合は左のオペランドを選択し、nullの場合は右のオペランドを選択します。

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

titleまたはgetTitleは関係ないことに注意してください。

データバインディングは、null値をチェックする必要はありません。バインディングクラスによって処理されます。

他の目的(デフォルト値の設定など)でnullをチェックする必要がある場合は、次のように使用できます。

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

または

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

上記の例は両方とも同じです。ここに @string/maleはデフォルト値で、item.gendernullです。

2
Khemraj