web-dev-qa-db-ja.com

Android XML Layoutの条件ステートメントの構文

データバインディングでは、レイアウトファイルに次のようなコードがよく表示されます。

<Variable name="displayIt" type="Boolean"/>

そして後で:

Android:visibility="@{displayIt ? View.VISIBLE : View.GONE}"

(もちろんAndroid.view.Viewは、View.VISIBLEとView.GONEが何らかの意味を持つために最初にインポートする必要があります)

これにより、ビューの制御がはるかに簡単になります。また、XMLレイアウトで条件文が許可されていることもわかりますが、google-fuが弱いようです。この構文を見つけようとしましたが、見つかりませんでした。リテラルを使用する場合はどうなりますか?何かのようなもの:

Android:text="{@isValid ? "valid" : "invalid"}"

(はい、私はそれがそれを行う愚かな方法であることを知っています、私はここで構文について話しているだけです)。または、リソースIDはどうですか?たぶん

Android:color="@{isValid ? R.color.green : R.color.red}"

できますか?適切な構文は何ですか?

19
htwu

データバインドステートメントを呼び出すための正しい構文は、"@{<some expression>}"、そして三項条件式は

"@{bool ? ifTrue : ifFalse}"

これらの2つの値は、データバインディングなしで通常XMLに配置する値の(引用符で囲まれていない)値です。

例えば

Android:color="@{isValid ? @color/green : @color/red}"

または、必要な静的フィールドを持つクラスをインポートできます。たとえば、

<data>
    <import type="Android.view.View"/>
</data>

そして

Android:visibility="@{isVisible ? View.VISIBLE : View.GONE}"

両方とも data binding documentation に示されています

35
cricket_007

簡単な構文

Android:text="@{user.gender ?? `male`}"

に等しい

Android:text="@{user.gender != null ? user.gender : `male`}"

Android Documentation から、利用可能な多くの式があります

Mathematical + - / * %
String concatenation +
Logical && ||
Binary & | ^
Unary + - ! ~
Shift >> >>> <<
Comparison == > < >= <=
instanceof
Grouping ()
Literals - character, String, numeric, null
Cast
Method calls
Field access
Array access []
Ternary operator ?:
5
Khemraj

この方法で複数の条件を組み合わせることもできます

<androidx.appcompat.widget.AppCompatTextView
     Android:layout_width="wrap_content"
     Android:layout_height="wrap_content"
     Android:text="@{sold_price == 0 ? (otherValue == 0 ? show_public_price : show_private_price) : (sold_price)}"
     Android:textColor="@color/colorRed"
     Android:textSize="@dimen/_12ssp" />
3