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}"/>

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}"/>

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

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.


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,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.