Użyj powiązania danych, aby ustawić widoczność widoku

102

Próbuje ustawić widoczność Viewprzy użyciu niestandardowych zmiennej, ale pojawia się błąd: Identifiers must have user defined types from the XML file. visible is missing it. Czy można ustawić widoczność widoku za pomocą powiązania danych? Dzięki.

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

<FrameLayout android:visibility="@{sale ? visible : gone}"/>
Konstantin Konopko
źródło

Odpowiedzi:

232

Jak podano w przewodniku dla programistów Androida , musisz to zrobić w następujący sposób:

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

<FrameLayout android:visibility="@{sale ? View.GONE : View.VISIBLE}"/>
David Artmann
źródło
6
i jak ustawić wartość na „wyprzedaż”?
RobinHood
Masz na myśli, jak przypisać wartość „sprzedaż” zmiennej typu String?
David Artmann
dokładnie! Mam problem. Udostępnij, porównam, a następnie dam znać.
RobinHood
41
Cholera! Jak przegapiłem Silly import . Zrobione dzięki.
RobinHood
Hej! jakiś pomysł, dlaczego usterka umieszczania na przewijaniu? Adapter
RobinHood
58

W swoim układzie:

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


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

W kodzie Java ViewModel:

@Bindable
public int getSaleVisibility(){
 return mSaleIndecator ? VISIBLE : GONE;
}
Lior
źródło
3
uratowałeś mnie od drobnego bólu głowy
Koen Van Looveren
2
Aby to zadziałało, model danych musi być obserwowalny.
yshahak
to działało dla mnie bez włączania @Bindable. Kiedy to dodałem, otrzymywałem różne błędy wiązania, w tym sugestię rozszerzenia BaseObservable. Dobry wskaźnik tutaj
Gene Bo
2
To musi być zaakceptowana odpowiedź! U mnie zadziałało idealnie!
Kryzys
Jakieś sugestie LiveData<Boolean>?
Sourav Bagchi
41

Problem polega na tym, że visibilityjest Integerna Viewzajęciach, co oznacza, że ​​masz dwa sposoby, aby to zadziałało:

  1. Użyj stałych View.VISIBLEi View.GONE. https://developer.android.com/topic/libraries/data-binding/index.html#imports
  2. Zdefiniuj niestandardowy ustawiacz, visibilityktóry ma plik Boolean. https://developer.android.com/topic/libraries/data-binding/index.html#custom_setters

Możliwa realizacja:

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

Co sprawi, że <FrameLayout android:visibility="@{sale}"/>zadziała.

Kiskae
źródło
4
Tam, gdzie jest to wygodne, procesor adnotacji automatycznie wykrywa je podczas kompilacji.
Kiskae
Dziękuję, umieściłem to w moim BindingUtils.java
nhoxbypass
ale jak ustawić wartość sprzedaży?
EslamWael74
1
jak mogę zastosować to samo podejście do tagów <include?
Zafer Celaloglu,
1
@ EslamWael74 ustawiasz wartość sprzedaży poprzez powiązanie w kodzie Java / Kotlin. Coś w rodzaju val binding = MyClassBinding.inflate (...), a następnie można po prostu wywołać binding.sale = true.
Matt Robertson,