Привязка данных 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();
Ответы
Ответ 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
Лучший способ
- Вы можете напрямую передать
Integer
значение visibility
как. - Вы можете установить значение
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>