通过数据绑定,我们现在经常在布局文件中看到如下代码:
<Variable name="displayIt" type="Boolean"/>
然后再说:
android:visibility="@{displayIt ? View.VISIBLE : View.GONE}"
(当然必须首先为View.VISIBLE和View.GONE导入android.view.View才有任何意义)
这使得控制视图变得更加容易。 它还告诉我在XML Layout中允许使用条件语句,但看起来我的google-fu很弱,我试过并找不到这个语法。 如果我想使用文字怎么办?类似的东西:
android:text="{@isValid ? "valid" : "invalid"}"
(是的,我知道这是一种愚蠢的方式,我只是在谈论语法)。 或者资源ID怎么样?也许像:
android:color="@{isValid ? R.color.green : R.color.red}"
可以吗?什么是正确的语法?
答案 0 :(得分:29)
调用数据绑定语句的正确语法类似于"@{<some expression>}"
,因此三元条件将是
"@{bool ? ifTrue : ifFalse}"
这两个值将是您通常在没有数据绑定的情况下放入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
中答案 1 :(得分:5)
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 ?:
答案 2 :(得分:2)
如果有人想像我们在“ if”中那样使用条件语句,则可以在任何视图的XML中使用以下条件语句。
app:visibleGone =“ @ {model!= null && model.somevariable}”
在“ &&”上方替换为“&amp;&amp”; (删除我本应放在此处的空白)
答案 3 :(得分:1)
您还可以通过这种方式组合多个条件
<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" />
答案 4 :(得分:0)
对于逻辑AND操作,请使用
“&amp;&amp;”
而不是&&没有空格,我在这里给出。
android:visibility="@{viewModel.isCardSelected() & ;& ; !viewModel.isPaymentMethodEmpty() ? View.VISIBLE : View.GONE}"