Привязка данных Android: видимость на теге include
согласно http://developer.android.com/tools/data-binding/guide.html#imports, мы можем иметь такие простые выражения в видимости:
<TextView
..
android:visibility="@{user.isAdult ? View.VISIBLE : View.GONE}"/>
но когда я пытаюсь сделать то же самое в include
tag, вот так:
<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();
4 ответов
Я представляю, что вы пытаетесь сделать, будет выглядеть примерно так:
в макете, который вы включаете, укажите логическую переменную и свяжите ее с видимостью нужного вида
<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}"/>
вы можете передать все необходимые параметры из родительского 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>
Это немного поздно,но я недавно столкнулся с этим.
Я считаю, что это на самом деле ошибка в компиляторе привязки данных, поскольку можно установить android:visibility
атрибут on <include>
tag напрямую (т. е. без привязки данных).
хорошее объяснение
- вы можете сразу пройти
Integer
стоимостьюvisibility
нравится. - вы можете установить значение по умолчанию
visibility
и параметрdefault=gone
в переплет.
например это 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>
и как
<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>