データバインディングでは、レイアウトファイルに次のようなコードがよく表示されます。
<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}"
できますか?適切な構文は何ですか?
データバインドステートメントを呼び出すための正しい構文は、"@{<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 に示されています
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 ?:
この方法で複数の条件を組み合わせることもできます
<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" />