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();
30
demandé sur Ishaan Garg 2016-03-01 16:08:24

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}"/>
45
répondu SeptimusX75 2016-03-02 20:00:15

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>
2
répondu yoAlex5 2018-05-08 14:05:08

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

0
répondu Maks 2018-07-26 02:29:19

bonne explication

  1. vous pouvez directement passer Integer valeur de visibility comme.
  2. vous pouvez définir la valeur par défaut de visibility aussi 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="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>
0
répondu Khemraj 2018-08-17 12:59:12