Verwenden Sie die Datenbindung, um die Sichtbarkeit der Ansicht festzulegen


97

Beim Versuch, die Sichtbarkeit der ViewVerwendung einer benutzerdefinierten Variablen festzulegen, tritt jedoch ein Fehler auf : Identifiers must have user defined types from the XML file. visible is missing it. Ist es möglich, die Sichtbarkeit der Ansicht mithilfe der Datenbindung festzulegen? Vielen Dank.

<data>
    <variable
        name="sale"
        type="java.lang.Boolean"/>
</data>

<FrameLayout android:visibility="@{sale ? visible : gone}"/>

Antworten:


218

Wie im Android Developer Guide angegeben , müssen Sie dies folgendermaßen tun:

<data>
    <import type="android.view.View"/>
    <variable
        name="sale"
        type="java.lang.Boolean"/>
</data>

<FrameLayout android:visibility="@{sale ? View.GONE : View.VISIBLE}"/>

5
und wie man den Wert auf "Verkauf" setzt?
RobinHood

Sie meinen also, wie Sie einer String-Variablen den Wert "sale" zuweisen können?
David Artmann

genau! Ich stehe vor einem Problem. Bitte teilen Sie ich werde vergleichen und Sie dann wissen lassen.
RobinHood

39
Verdammt! Wie ich den Silly- Import verpasst habe . Fertig, danke.
RobinHood

Hallo! Irgendeine Idee, warum Positionsfehler auf der Schriftrolle liegen? Adapter
RobinHood

56

In Ihrem Layout:

<data>
    <variable
        name="viewModel"
        type="...."/>
</data>


<View
 android:layout_width="10dp"
 android:layout_height="10dp"
 android:visibility="@{viewModel.saleVisibility, default=gone}"/>

In Ihrem ViewModel-Java-Code:

@Bindable
public int getSaleVisibility(){
 return mSaleIndecator ? VISIBLE : GONE;
}

3
Sie retteten mich vor leichten Kopfschmerzen
Koen Van Looveren

2
Ihr Datenmodell muss beobachtbar sein, damit dies funktioniert.
Yshahak

Das hat bei mir ohne Einbeziehung funktioniert @Bindable. Als ich hinzufügte, dass ich verschiedene Bindungsfehler bekam, einschließlich des Vorschlags zur Erweiterung BaseObservable. Guter Zeiger hier
Gene Bo

2
Muss die akzeptierte Antwort sein! Es hat bei mir perfekt funktioniert!
Krise

Irgendwelche Vorschläge für LiveData<Boolean>?
Sourav Bagchi

41

Das Problem ist , dass visibilityeine ist Integerauf der ViewKlasse, das heißt , Sie haben zwei Möglichkeiten , diese Arbeit zu machen:

  1. Verwenden Sie die Konstanten View.VISIBLEund View.GONE. https://developer.android.com/topic/libraries/data-binding/index.html#imports
  2. Definieren Sie eine benutzerdefinierte Setter für visibilitydas eine nimmt Boolean. https://developer.android.com/topic/libraries/data-binding/index.html#custom_setters

Mögliche Implementierung:

@BindingAdapter("android:visibility")
public static void setVisibility(View view, Boolean value) {
    view.setVisibility(value ? View.VISIBLE : View.GONE);
}

Welches wird <FrameLayout android:visibility="@{sale}"/>Arbeit machen .


4
Wo es für Sie am bequemsten ist, erkennt der Anmerkungsprozessor sie beim Kompilieren automatisch.
Kiskae

Vielen Dank, ich habe es in meine BindingUtils.java
nhoxbypass

aber wie setzt man den Wertverkauf?
EslamWael74

1
Wie kann ich denselben Ansatz auf <include-Tags anwenden?
Zafer Celaloglu

1
@ EslamWael74 Sie legen den Verkaufswert über die Bindung in Ihrem Java / Kotlin-Code fest. So etwas wie val binding = MyClassBinding.inflate (...), und dann können Sie einfach binding.sale = true aufrufen.
Matt Robertson
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.