web-dev-qa-db-fra.com

Liaison de données Android: visibilité sur la balise include

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();
32
Ishaan Garg

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

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>
3
yoAlex5

Essayer: 

this.imageLayout.getRoot().setVisibility(NotifTypeNotificatio1);
1
julzborrego

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).

1
Maks

Meilleur moyen

  1. Vous pouvez directement passer Integer valeur de visibility like.
  2. Vous pouvez définir la valeur par défaut de 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>
0
Khemraj