tutorial studio español ejemplo edittext databinding data android android-databinding

studio - Enlace de datos de Android: visibilidad en la etiqueta de inclusión



data binding vs butterknife (4)

Esto es un poco tarde, pero me he encontrado con esto recientemente.

Creo que esto es en realidad un error en el compilador de enlace de datos, ya que es posible establecer el atributo de android:visibility directamente en la etiqueta <include> (es decir, sin enlace de datos).

Según http://developer.android.com/tools/data-binding/guide.html#imports , podemos tener expresiones tan simples en visibilidad:

<TextView .. android:visibility="@{user.isAdult ? View.VISIBLE : View.GONE}"/>

Pero cuando intento hacer lo mismo en una etiqueta de include , así:

<include android:id="@+id/image_layout" layout="@layout/image_layout" android:visibility="@{notification.notifType == 0 ? View.VISIBLE : View.GONE}"/>

Luego, Studio no solo muestra la expresión en rojo, sino que al crearla, da el siguiente error en la clase de enlace generada automáticamente:

Error: (138, 29) error: no se puede encontrar el método de símbolo setVisibility (int)

Aquí es donde se produce el error en la clase de enlace generada automáticamente

// batch finished if ((dirtyFlags & 0x3L) != 0) { // api target 1 this.imageLayout.setVisibility(NotifTypeNotificatio1); } imageLayout.executePendingBindings();


Me imagino que lo que estás tratando de hacer se vería así:

En el diseño que está incluyendo, especifique una variable booleana y conéctela a la visibilidad de la vista deseada

<layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <import type="android.view.View"/> <variable name="isVisible" type="boolean"/> </data> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="@{isVisible ? View.VISIBLE : View.GONE}"/> </layout>

Entonces, en su diseño de llamada, une tu valor.

<include android:id="@+id/image_layout" layout="@layout/image_layout" bind:isVisible="@{notification.notifType == 0}"/>


Puede pasar todos los parámetros necesarios del xml principal al xml incluido a través del espacio de nombres "http://schemas.android.com/apk/res-auto" .

La sintaxis es res-auto namespace:variable name

Por ejemplo

<?xml version="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <android.support.design.widget.CoordinatorLayout android:layout_width="match_parent" android:layout_height="match_parent"> <include layout="@layout/include_user_image" android:layout_width="match_parent" android:layout_height="match_parent" app:isVisible="@{true}" /> </android.support.design.widget.CoordinatorLayout> </layout>

include_user_image.xml

<?xml version="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <import type="android.view.View" /> <variable name="isVisible" type="boolean" /> </data> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="@{isVisible ? View.VISIBLE : View.GONE}" /> </layout>


Buena explicacion

  1. Puede pasar directamente el valor Integer de la visibility como.
  2. También puede establecer el valor predeterminado de visibility estableciendo default=gone en el enlace.

Por ejemplo, esto está included_layout.xml

<layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="visibility" type="Integer"/> </data> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="@{visibility, default=gone}" /> </layout>

y usar como

<layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <import type="android.view.View"/> </data> <include android:id="@+id/included_layout" layout="@layout/included_layout" app:visibility="@{View.VISIBLE}"/> </layout>