Usar enlace de datos para configurar la visibilidad de la vista

97

Tratar de establecer la visibilidad del Viewuso de variable personalizada, sino que se produce el error: Identifiers must have user defined types from the XML file. visible is missing it. ¿Es posible configurar 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}"/>
Konstantin Konopko
fuente

Respuestas:

218

Como se indica en la Guía para desarrolladores de Android , debe hacerlo así:

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

<FrameLayout android:visibility="@{sale ? View.GONE : View.VISIBLE}"/>
David Artmann
fuente
5
y cómo establecer el valor en "venta"?
RobinHood
Entonces, ¿te refieres a cómo asignar el valor "venta" a una variable de cadena?
David Artmann
¡exactamente! Estoy enfrentando un problema. Por favor comparta que compararé y luego se lo haré saber.
RobinHood
39
¡Maldición! Cómo extrañé la importación tonta . Hecho, gracias.
RobinHood
¡Oye! ¿ Alguna idea de por qué colocar la falla en el desplazamiento? Adaptador
RobinHood
56

En tu 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;
}
Lior
fuente
3
me salvaste de un dolor de cabeza menor
Koen Van Looveren
2
Su modelo de datos debe ser observable para que funcione.
yshahak
esto funcionó para mí sin incluir @Bindable. Cuando incluí eso, recibía diferentes errores vinculantes, incluida la sugerencia para extender BaseObservable. Buen puntero aquí
Gene Bo
2
¡Debe ser la respuesta aceptada! ¡Me ha funcionado perfectamente!
Crisic
¿Alguna sugerencia para LiveData<Boolean>?
Sourav Bagchi
41

El problema es que visibilityestá Integeren la Viewclase, esto significa que tiene dos formas de hacer que esto funcione:

  1. Utilice las constantes View.VISIBLEy View.GONE. https://developer.android.com/topic/libraries/data-binding/index.html#imports
  2. Definir un configurador personalizado para visibilityeso requiere un Boolean. 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.

Kiskae
fuente
4
Cuando le resulte conveniente, el procesador de anotaciones los detecta automáticamente durante la compilación.
Kiskae
Gracias, lo puse en mi BindingUtils.java
nhoxbypass
pero ¿cómo establecer la venta de valor?
EslamWael74
1
¿Cómo puedo aplicar el mismo enfoque a <incluir etiquetas?
Zafer Celaloglu
1
@ EslamWael74 establece el valor de venta a través del enlace en su código Java / Kotlin. Algo como val binding = MyClassBinding.inflate (...), y luego puedes simplemente llamar a binding.sale = true.
Matt Robertson