Подтвердить что ты не робот

Привязка данных Android: видимость на теге include

В соответствии с http://developer.android.com/tools/data-binding/guide.html#imports мы можем иметь такие простые выражения в видимости:

<TextView
..
android:visibility="@{user.isAdult ? View.VISIBLE : View.GONE}"/>

Но когда я пытаюсь сделать то же самое в теге include, например:

<include
android:id="@+id/image_layout"
layout="@layout/image_layout"
android:visibility="@{notification.notifType == 0 ? View.VISIBLE : View.GONE}"/>

Затем Studio не только отображает выражение в красном цвете, но и при его создании дает следующую ошибку в автоматически сгенерированном классе привязки:

Ошибка: (138, 29) ошибка: не удается найти метод символа setVisibility (int)

Здесь, где ошибка возникает в автоматически сгенерированном классе привязки

// batch finished
if ((dirtyFlags & 0x3L) != 0) {
    // api target 1
    this.imageLayout.setVisibility(NotifTypeNotificatio1);
}
imageLayout.executePendingBindings();
4b9b3361

Ответ 1

Я представляю, что вы пытаетесь сделать, будет выглядеть примерно так:

В макете, который вы включаете, укажите логическую переменную и привяжите ее к видимой видимости вида

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

Затем в вашем макете вызова свяжите свое значение

<include
    android:id="@+id/image_layout"
    layout="@layout/image_layout"
    bind:isVisible="@{notification.notifType == 0}"/>

Ответ 2

Вы можете передать все необходимые параметры из родительского xml во включенный xml через пространство имен "http://schemas.android.com/apk/res-auto".

Синтаксис res-auto namespace:variable name

Например

<?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

Лучший способ

  1. Вы можете напрямую передать Integer значение visibility как.
  2. Вы можете установить значение visibility по default=gone также, установив default=gone в привязке.

Например, это 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>

и использовать как

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

Ответ 4

Пытаться:

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

Ответ 5

Это немного поздно, но я столкнулся с этим недавно.

Я считаю, что это на самом деле ошибка в компиляторе привязки данных, так как можно напрямую установить атрибут android:visibility в <include> (т.е. без привязки данных).

Ответ 6

Вы можете найти включенный макет по его идентификатору и скрыть его с помощью атрибута visibility.

Например, в Котлине,

binding.root.findViewById<CardView>(R.id.layout_inclulded).visibility = View.GONE

где,

root является атрибутом по умолчанию для корневого элемента в родительском макете.

CardView является корневым элементом включенного макета в моем случае.

R.id.layout_inclulded - это id включенного макета в родительском макете.

Ответ 7

Спасибо всем, вы мне очень помогли. Ваши ответы были частью моих успехов в этой проблеме.

Мы хотели установить видимость представления изображения, которое также было целью некоторой анимации. Сцена движения взяла на себя управление видимостью. Установите свойство свойства app: visibilityMode, чтобы "игнорировать", решить все.

<MotionScene xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">

<ConstraintSet android:id="@+id/expanded">
<!-- ... -->
    <Constraint
        android:id="@+id/myImageViewId"
        app:visibilityMode="ignore"/>
</ConstraintSet>
<!-- ... -->
</MotionScene>