android - studio - data binding vs butterknife
Utilizar enlace de datos para establecer la visibilidad de la vista (3)
Como se indica en la Guía del desarrollador de Android , debes hacerlo así:
<data>
<import type="android.view.View"/>
<variable
name="sale"
type="java.lang.Boolean"/>
</data>
<FrameLayout android:visibility="@{sale ? View.GONE : View.VISIBLE}"/>
Esta pregunta ya tiene una respuesta aquí:
Intentando establecer la visibilidad de la View
usando una variable personalizada, pero se produce un error: los Identifiers must have user defined types from the XML file. visible is missing it
Identifiers must have user defined types from the XML file. visible is missing it
. ¿Es posible establecer la visibilidad de la vista mediante el enlace de datos? Gracias.
<data>
<variable
name="sale"
type="java.lang.Boolean"/>
</data>
<FrameLayout android:visibility="@{sale ? visible : gone}"/>
El problema es que la visibility
es un Integer
en la clase View
, esto significa que tiene dos formas de hacer que esto funcione:
- Use las constantes
View.VISIBLE
yView.GONE
. https://developer.android.com/topic/libraries/data-binding/index.html#imports - Definir un configurador personalizado para la
visibility
que toma unBoolean
. https://developer.android.com/topic/libraries/data-binding/index.html#custom_setters
Posible implementación:
@BindingAdapter("android:visibility")
public static void setVisibility(View view, Boolean value) {
view.setVisibility(value ? View.VISIBLE : View.GONE);
}
Lo que hará que <FrameLayout android:visibility="@{sale}"/>
funcione.
En su diseño:
<data>
<variable
name="viewModel"
type="...."/>
</data>
<View
android:layout_width="10dp"
android:layout_height="10dp"
android:visibility="@{viewModel.saleVisibility, default=gone}"/>
En su código java de ViewModel:
@Bindable
public int getSaleVisibility(){
return mSaleIndecator ? VISIBLE : GONE;
}