Android XML Layout

时间:2016-07-16 04:16:54

标签: android xml android-databinding

通过数据绑定,我们现在经常在布局文件中看到如下代码:

<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}"

可以吗?什么是正确的语法?

5 个答案:

答案 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() &amp ;&amp ; !viewModel.isPaymentMethodEmpty() ? View.VISIBLE : View.GONE}"