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?
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
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 ?:
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" />