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

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

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

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.


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.