Синтаксис условных операторов в формате 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" />