Próbuje ustawić widoczność View
przy 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}"/>
android
android-databinding
Konstantin Konopko
źródło
źródło
Odpowiedzi:
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}"/>
źródło
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; }
źródło
@Bindable
. Kiedy to dodałem, otrzymywałem różne błędy wiązania, w tym sugestię rozszerzeniaBaseObservable
. Dobry wskaźnik tutajLiveData<Boolean>
?Problem polega na tym, że
visibility
jestInteger
naView
zajęciach, co oznacza, że masz dwa sposoby, aby to zadziałało:View.VISIBLE
iView.GONE
. https://developer.android.com/topic/libraries/data-binding/index.html#importsvisibility
który ma plikBoolean
. https://developer.android.com/topic/libraries/data-binding/index.html#custom_settersMoż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.źródło