182 votes

Liaison de données Android à l'aide de l'opérateur logique "&&".

J'essaie d'utiliser l'opérateur "&&" dans un fichier xml à l'aide d'une liaison de données Android,

android:visibility="@{(bean.currentSpaceId == bean.selectedSpaceId **&&** bean.currentSpaceId > 0)? View.VISIBLE: View.GONE}"

mais j'ai obtenu l'erreur de compilation :

Erreur:L'exécution a échoué pour la tâche ':app:dataBindingProcessLayoutsDevDebug'. org.xml.sax.SAXParseException ; systemId : file:/Users/path/app/build/intermediates/res/merged/dev/debug/layout/fragment_space.xml ; lineNumber : 106 ; columnNumber : 89 ; Le nom de l'entité doit suivre immédiatement le '&' dans la référence de l'entité.

et surligner en rouge l'erreur dans Android studio "unscaped & or non terminated character".

Alors, comment dois-je régler ce problème ?

Edit : a trouvé la réponse, ces caractères doivent être échappés :

'&' --> '&'

'<' --> '&lt;'

'>' --> '&gt;'

1 votes

J'ai remarqué que je peux utiliser ">" et "<" dans les fichiers xml de mise en page.

311voto

Nannuo Lei Points 608

&& devrait être rendu comme &amp;&amp; .

L'officiel guide de reliure des données contient des exemples d'opérateurs de comparaison où ces entités XML sont utilisées, par exemple

android:visibility="@{age &lt; 13 ? View.GONE : View.VISIBLE}"

Modifier

L'exemple d'expressions que j'ai mentionné dans la réponse a disparu de la version anglaise de la documentation depuis que cette réponse a été écrite. Elles subsistent dans certaines versions non anglaises périmées de la documentation, comme la version espagnole.

Quoi qu'il en soit, la réponse initiale reste valable, car l'utilisation d'entités XML dans le XML est standard dans le XML et n'a rien à voir avec Android lui-même.

14 votes

N'utilisez pas de logique de domaine dans les expressions de liaison, vous avez des préséteurs/contrôleurs pour cela.

4 votes

@ArtjomKönig qu'en est-il si vous devez cacher/afficher certains contrôles dans l'interface utilisateur ? J'utilise la bibliothèque de liaison de données pour ne pas écrire de code d'interface utilisateur.

3 votes

@Krusty Implémentez une méthode isMyControlVisible() dans votre présentateur, où vous utilisez votre logique de domaine pour renvoyer true ou false. Liez-vous à cette méthode.

67voto

Khemraj Points 8449

Liste des entités HTML

Vous ne pouvez pas utiliser & ou un autre Entité HTML en XML. Vous devez donc utiliser des caractères d'échappement.

android:text="@{(1==1 &amp;&amp; 2>0) ? `true` : `false`}"

Entités de caractères HTML souvent utilisées dans Android :

+--------+----------------------------+--+--+--+
| Symbol | Equivalent HTML Entity     |  |  |  |
+--------+----------------------------+--+--+--+
| >      | &gt;                       |  |  |  |
+--------+----------------------------+--+--+--+
| <      | &lt;                       |  |  |  |
+--------+----------------------------+--+--+--+
| "      | &quot;, &ldquo; or &rdquo; |  |  |  |
+--------+----------------------------+--+--+--+
| '      | &apos;, &lsquo; or &rsquo; |  |  |  |
+--------+----------------------------+--+--+--+
| }      | &#125;                     |  |  |  |
+--------+----------------------------+--+--+--+
| &      | &amp;                      |  |  |  |
+--------+----------------------------+--+--+--+
| space  | &#160;                     |  |  |  |
+--------+----------------------------+--+--+--+

Ici est une liste complète des entités HTML.

22voto

Ollie C Points 13789

L'échappement de && dans le balisage de la mise en page est une très mauvaise solution. Il est préférable de créer une méthode sur l'objet (view)model :

android:visibility="@{user.adult ? View.VISIBLE : View.GONE}"

public boolean isAdult() {
    return age >= 18;
}

5 votes

Bien que ce soit une bonne solution, elle n'est malheureusement pas appelée lorsque la valeur de la variable change (notifyPropertyChanged) et la visibilité ne sera pas mise à jour.

3 votes

Utilisation de @BerndKampl ObservableBoolean isAdult

0 votes

Cela ne va pas marcher, il ne sera appelé qu'une fois !

5voto

Bernd Kampl Points 452

La meilleure solution que j'ai trouvée à ce problème a été d'introduire une nouvelle méthode Bindable.

Avant :

item_recyclerview.xml :

<EditText
...
android:enabled="@{myViewModel.myDataModelClass.lastAddedItem &amp;&amp; !myViewModel.myDataModelClass.editTextDisabled}"
/>

MyDataModelClass (qui se trouve dans mon modèle de vue).

...
private boolean lastAddedItem;
private boolean editTextDisabled;
...
@Bindable
public boolean isLastAddedItem() {
    return lastAddedItem;
}
public void setLastAddedItem(boolean lastAddedItem) {
    this.lastAddeditem = lastAddedItem;
    notifyPropertyChanged(BR.lastAddedItem);
}
@Bindable
public boolean isEditTextDisabled() {
    return editTextDisabled;
}
public void setEditTextDisabled(boolean editTextDisabled) {
    this.editTextDisabled = editTextDisabled;
    notifyPropertyChanged(BR.editTextDisabled);
}

Après :

item_recyclerview.xml :

<EditText
...
android:enabled="@{myViewModel.myDataModelClass.enableEditing}"
/>

MyDataModelClass (qui se trouve dans mon modèle de vue).

...
private boolean lastAddedItem;
private boolean editTextDisabled;
...
@Bindable
public boolean isLastAddedItem() {
    return lastAddedItem;
}
public void setLastAddedItem(boolean lastAddedItem) {
    this.lastAddeditem = lastAddedItem;
    notifyPropertyChanged(BR.lastAddedItem);
    notifyPropertyChanged(BR.isEnableEditing);
}
@Bindable
public boolean isEditTextDisabled() {
    return editTextDisabled;
}
public void setEditTextDisabled(boolean editTextDisabled) {
    this.editTextDisabled = editTextDisabled;
    notifyPropertyChanged(BR.editTextDisabled);
    notifyPropertyChanged(BR.isEnableEditing);
}
@Bindable
public boolean isEnableEditing() {
    return isLastAddedItem() && !isEditTextDisabled();
}

0 votes

Ce code utilise les classes BaseObservable, BR est la classe de liaison générée. Voir cet article pour une explication plus détaillée : medium.com/@jencisov/

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X