Синтаксис условных операторов в формате XML для Android
С привязкой данных мы теперь часто видим коды в файлах макета, например:
<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"}"
(да, я знаю, что это глупый способ сделать это, я просто говорю о синтаксисе здесь).
Или как насчет идентификаторов ресурсов? Может быть, как:
android:color="@{isValid ? R.color.green : R.color.red}"
Можно ли это сделать? Какой правильный синтаксис?
Ответы
Ответ 1
Правильный синтаксис для вызова оператора привязки данных выглядит как "@{<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}"
Оба из которых показаны в документации по привязке данных
Ответ 2
простой синтаксис
android:text="@{user.gender ?? "male"}"
эквивалентно
android:text="@{user.gender != null ? user.gender : "male"}"
Из документации Android у вас есть много доступных выражений
Mathematical + - / * %
String concatenation +
Logical && ||
Binary & | ^
Unary + - ! ~
Shift >> >>> <<
Comparison == > < >= <=
instanceof
Grouping ()
Literals - character, String, numeric, null
Cast
Method calls
Field access
Array access []
Ternary operator ?:
Ответ 3
Вы также можете комбинировать несколько условий таким образом
<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" />