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.