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
- Puede pasar directamente el valor
Integer
de lavisibility
como. - También puede establecer el valor predeterminado de
visibility
estableciendodefault=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>