Liaison de données Android: visibilité sur la balise include
selon http://developer.android.com/tools/data-binding/guide.html#imports , nous pouvons avoir des expressions aussi simples dans la visibilité:
<TextView
..
android:visibility="@{user.isAdult ? View.VISIBLE : View.GONE}"/>
mais quand j'essaie de faire la même chose dans une étiquette include
, comme ainsi:
<include
android:id="@+id/image_layout"
layout="@layout/image_layout"
android:visibility="@{notification.notifType == 0 ? View.VISIBLE : View.GONE}"/>
alors Studio ne montre pas seulement l'expression en rouge, mais lors de la construction il donne l'erreur suivante dans la classe de liaison générée automatiquement:
Erreur: (138, 29) erreur: Impossible de trouver le symbole method setVisibility (int)
voici où l'erreur se produit dans la classe de liaison générée automatiquement
// batch finished
if ((dirtyFlags & 0x3L) != 0) {
// api target 1
this.imageLayout.setVisibility(NotifTypeNotificatio1);
}
imageLayout.executePendingBindings();
4 réponses
j'imagine que vous essayez de faire ressemblerait à quelque chose comme ceci:
dans la mise en page que vous incluez, spécifiez une variable booléenne et liez-la à la visibilité désirée
<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>
puis dans votre disposition d'appel liez votre valeur
<include
android:id="@+id/image_layout"
layout="@layout/image_layout"
bind:isVisible="@{notification.notifType == 0}"/>
vous êtes en mesure de passer tous les paramètres nécessaires de parent xml dans inclus xml via "http://schemas.android.com/apk/res-auto"
namespace.
la syntaxe est res-auto namespace:variable name
par exemple
<?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>
c'est un peu tard, mais je l'ai rencontré récemment.
je crois qu'il s'agit en fait d'un bug dans le compilateur de liaison de données car il est possible de définir android:visibility
attribut sur <include>
étiquette directement (c.-à-d. sans liaison de données).
bonne explication
- vous pouvez directement passer
Integer
valeur devisibility
comme. - vous pouvez définir la valeur par défaut de
visibility
aussi en définissantdefault=gone
dans la liaison.
par exemple c'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>
et utiliser comme
<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>