理解できません...変数フィールドが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英語でごめんなさい。
データバインディングは、一般的に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.gender
はnull
です。