web-dev-qa-db-fra.com

android liaison de données à l'aide de l'opérateur logique "&&"

J'essaie d'utiliser l'opérateur and "&&" en xml avec Android databinding,

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

mais j'ai eu 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; numéro de ligne: 106; numéro de colonne: 89; Le nom de l'entité doit immédiatement suivre le '&' dans la référence de l'entité.

et erreur de surbrillance rouge dans Android studio "caractère non échappé ou non terminé".

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

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

'&' --> '&'

'<' --> '&lt;'

'>' --> '&gt;'
99
David Cheung

&& devrait être rendu sous la forme &amp;&amp;.

Official data binding guide a des exemples d’opérateurs de comparaison utilisant ces entités XML, par exemple

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

Modifier

Les exemples d'expressions que j'ai mentionnés dans la réponse ont disparu de la version anglaise de la documentation depuis que cette réponse a été écrite. Ils survivent dans certaines versions obsolètes non anglaises de la documentation, telles que la version espagnole.

Quoi qu'il en soit, la réponse d'origine est toujours valable, car l'utilisation d'entités XML en XML est standard en XML et n'a rien à voir avec Android.

197
Leonardo Acevedo

Échapper && dans la mise en page est une très mauvaise solution. Il est préférable de créer une méthode sur l'objet modèle (vue):

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

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

Liste des entités HTML

Vous ne pouvez pas utiliser & ou un autre entité HTML en XML. Donc, vous devez utiliser un caractère 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.

13
Khemraj

La meilleure solution que je pouvais trouver pour résoudre ce problème était l'introduction d'une nouvelle méthode Bindable.

Avant:

item_recyclerview.xml:

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

MyDataModelClass: (qui se tient 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 tient 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();
}
1
Bernd Kampl