Selon http://developer.Android.com/tools/data-binding/guide.html#imports , nous pouvons avoir de telles expressions 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 balise include
, comme ceci:
<include
Android:id="@+id/image_layout"
layout="@layout/image_layout"
Android:visibility="@{notification.notifType == 0 ? View.VISIBLE : View.GONE}"/>
Ensuite, Studio affiche non seulement l'expression en rouge, mais lors de la construction, l'erreur suivante apparaît dans la classe de liaison générée automatiquement:
Erreur: (138, 29) erreur: impossible de trouver la méthode du symbole 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();
J'imagine que ce que vous essayez de faire pourrait ressembler à ceci:
Dans la mise en page que vous incluez, spécifiez une variable booléenne et liez-la à la visibilité de la vue souhaité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>
Ensuite, dans votre mise en page appelante lier votre valeur
<include
Android:id="@+id/image_layout"
layout="@layout/image_layout"
bind:isVisible="@{notification.notifType == 0}"/>
Vous pouvez transmettre tous les paramètres nécessaires du fichier XML parent au fichier XML inclus via l'espace de noms "http://schemas.Android.com/apk/res-auto"
.
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>
Essayer:
this.imageLayout.getRoot().setVisibility(NotifTypeNotificatio1);
C'est un peu tard, mais je l'ai vu récemment.
Je crois que c'est en fait un bogue dans le compilateur de liaison de données car il est possible de définir l'attribut Android:visibility
directement sur la balise <include>
(c'est-à-dire sans liaison de données).
Integer
valeur de visibility
like.visibility
également en définissant default=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="int"/>
</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>