web-dev-qa-db-fra.com

Syntaxe des instructions conditionnelles dans la disposition XML Android

Avec la liaison de données, nous voyons maintenant souvent des codes dans les fichiers de présentation comme ceci:

<Variable name="displayIt" type="Boolean"/>

et plus tard ensuite:

Android:visibility="@{displayIt ? View.VISIBLE : View.GONE}"

(bien entendu, Android.view.View doit d'abord être importé pour que View.VISIBLE et View.GONE aient une signification quelconque)

Cela rend le contrôle de la vue beaucoup plus facile ... Cela me dit également que les instructions conditionnelles sont autorisées dans XML Layout, mais il semble que mon google-fu soit faible, j'ai essayé et je n'ai pas pu trouver la syntaxe pour cela . Et si je veux utiliser des littéraux? Quelque chose comme:

Android:text="{@isValid ? "valid" : "invalid"}"

(oui je sais que c'est une façon stupide de le faire, je parle juste de la syntaxe ici) . Ou qu'en est-il des identifiants de ressources? Peut-être aimer:

Android:color="@{isValid ? R.color.green : R.color.red}"

Cela peut-il être fait? Quelle est la syntaxe appropriée?

11
htwu

La syntaxe correcte pour appeler une instruction de liaison de données ressemble à "@{<some expression>}", de sorte qu'une condition ternaire serait 

"@{bool ? ifTrue : ifFalse}"

Où ces deux valeurs seraient les valeurs (non mises entre guillemets) de ce que vous placeriez normalement dans le XML sans liaison de données. 

Par exemple 

Android:color="@{isValid ? @color/green : @color/red}"

Ou, vous pouvez importer une classe qui a un champ statique dont vous avez besoin, par exemple 

<data>
    <import type="Android.view.View"/>
</data>

Et 

Android:visibility="@{isVisible ? View.VISIBLE : View.GONE}"

Ces deux éléments sont indiqués dans documentation de liaison de données

24
cricket_007

syntaxe simple

Android:text="@{user.gender ?? `male`}"

est équivalent à 

Android:text="@{user.gender != null ? user.gender : `male`}"

De Documentation Android , vous avez de nombreuses expressions disponibles

Mathematical + - / * %
String concatenation +
Logical && ||
Binary & | ^
Unary + - ! ~
Shift >> >>> <<
Comparison == > < >= <=
instanceof
Grouping ()
Literals - character, String, numeric, null
Cast
Method calls
Field access
Array access []
Ternary operator ?:
5
Khemraj

Vous pouvez également combiner plusieurs conditions de cette manière

<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" />
0
KishanSolanki124