Android-Datenbindung mit dem logischen Operator “&&”.

Lesezeit: 1 Minute

Benutzer-Avatar
Chubao

Ich versuche, den Operator und “&&” in XML mit Android-Datenbindung zu verwenden.

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

aber ich habe den Kompilierungsfehler:

Fehler: Ausführung für Aufgabe „:app:dataBindingProcessLayoutsDevDebug“ fehlgeschlagen. org.xml.sax.SAXParseException; systemId: file:/Users/path/app/build/intermediates/res/merged/dev/debug/layout/fragment_space.xml; Zeilennummer: 106; Spaltennummer: 89; Der Entity-Name muss unmittelbar nach dem ‘&’ in der Entity-Referenz folgen.

und roter Hervorhebungsfehler in Android Studio “unmaskiertes & oder nicht beendetes Zeichen”.

Also wie soll ich das beheben?

Bearbeiten:
Wenn Sie die Antwort gefunden haben, muss dieses Zeichen maskiert werden:

'&' --> '&'

'<' --> '&lt;'

'>' --> '&gt;'

  • Mir ist aufgefallen, dass ich “>” und “<" in Layout-XML-Dateien verwenden kann.

    – Hong

    6. Juli 2019 um 22:28 Uhr

Benutzer-Avatar
Leo unterstützt Monica Cellio

&& sollte gerendert werden als &amp;&amp;.

Das offizielle Anleitung zur Datenbindung enthält Beispiele für Vergleichsoperatoren, bei denen diese XML-Entitäten beispielsweise verwendet werden

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

Bearbeiten

Die Beispielausdrücke, die ich in der Antwort erwähnt habe, sind seit dem Schreiben dieser Antwort aus der englischen Version der Dokumentation verschwunden. Sie überleben in einigen veralteten nicht-englischen Versionen der Dokumente wie der spanischen Version.

In jedem Fall ist die ursprüngliche Antwort immer noch gültig, da die Verwendung von XML-Entitäten in XML Standard in XML ist und nichts mit Android selbst zu tun hat.

  • Verwenden Sie keine Domänenlogik in Bindungsausdrücken, dafür haben Sie Voreinstellungen/Controller.

    – artkönig

    9. Juni 2017 um 20:37 Uhr

  • @ArtjomKönig was ist, wenn Sie einige Steuerelemente in der Benutzeroberfläche ausblenden/anzeigen müssen? Ich verwende die Datenbindungsbibliothek, um keinen UI-Code zu schreiben

    – Krustig

    18. Januar 2018 um 15:07 Uhr

  • @Krusty Implementieren Sie eine Methode isMyControlVisible() in Ihrem Presenter, wo Sie Ihre Domänenlogik verwenden, um wahr oder falsch zurückzugeben. Binden Sie an diese Methode.

    – artkönig

    18. Januar 2018 um 15:23 Uhr


  • Ich denke, wenn Sie zu viele boolesche Variablen haben, ist diese Lösung in Ordnung. Andernfalls hätte Ihr Code reichlich ObservableBoolean.set

    – Lester

    26. Februar 2018 um 9:58 Uhr


  • @artkoenig dann müssten Sie diese zusätzlichen booleschen Werte überall dort beibehalten, wo Sie auf das Layout verweisen. Fehlerquelle.

    – Ali Kasi

    18. Januar 2019 um 1:29 Uhr

Benutzer-Avatar
Khemraj Sharma

Liste von HTML-Entitäten

Sie können nicht verwenden & oder etwas anderes HTML-Entität im XML-Format. Sie müssen also Fluchtzeichen verwenden.

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

HTML-Zeicheneinheiten, die häufig in Android verwendet werden:

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

Hier ist eine vollständige Liste von HTML-Entitäten.

Es ist eine sehr schlechte Lösung, && im Layout-Markup zu maskieren. Es ist besser, eine Methode auf dem (Ansichts-)Modellobjekt zu erstellen:

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

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

  • Dies ist zwar eine gute Lösung, wird aber leider nicht aufgerufen, wenn sich der Variablenwert ändert (notifyPropertyChanged), und die Sichtbarkeit wird nicht aktualisiert.

    – Bernd Kampl

    22. Dezember 2016 um 11:20 Uhr

  • @BerndKampl Verwenden ObservableBoolean isAdult

    – S1ngoooor

    4. Januar 2017 um 4:42 Uhr

  • Das wird nicht funktionieren, es wird nur einmal aufgerufen!

    – CodierungTT

    28. Februar 2018 um 1:30 Uhr

  • @BerndKampl wie man es benutzt, es wird noch einmal aufgerufen

    – CodierungTT

    28. Februar 2018 um 1:31 Uhr

  • @CodingTT Schauen Sie sich meine Antwort an, Sie benötigen irgendwo einen NotifyPropertyChanged-Aufruf, um ihn zu aktualisieren.

    – Bernd Kampl

    7. März 2018 um 7:17 Uhr

Die beste Lösung, die ich für dieses Problem finden konnte, war die Einführung einer neuen Bindable-Methode.

Vor:

item_recyclerview.xml:

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

MyDataModelClass: (was in meinem Ansichtsmodell gehalten wird)

...
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);
}

Nach:

item_recyclerview.xml:

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

MyDataModelClass: (was in meinem Ansichtsmodell gehalten wird)

...
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();
}

Probieren Sie die ‘compareTo’-Methode im XML-Format aus

android:visibility=${viewModel.intValue.compareTo(0) == -1 ? View.GONE : View.VISIBLE}"

1344610cookie-checkAndroid-Datenbindung mit dem logischen Operator “&&”.

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy