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}"/>
Konstantin Konopko
quelle

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}"/>
David Artmann
quelle
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;
}
Lior
quelle
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 .

Kiskae
quelle
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