Android数据绑定:包含标记的可见性

Ish*_*arg 39 android android-databinding

根据http://developer.android.com/tools/data-binding/guide.html#imports,我们可以在可见性中使用这样简单的表达式:

<TextView
..
android:visibility="@{user.isAdult ? View.VISIBLE : View.GONE}"/>
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试在include标签中执行相同操作时,如下所示:

<include
android:id="@+id/image_layout"
layout="@layout/image_layout"
android:visibility="@{notification.notifType == 0 ? View.VISIBLE : View.GONE}"/>
Run Code Online (Sandbox Code Playgroud)

然后Studio不仅以红色显示表达式,而且在构建时它会在自动生成的绑定类中显示以下错误:

错误:(138,29)错误:找不到符号方法setVisibility(int)

这是自动生成的绑定类中发生错误的位置

// batch finished
if ((dirtyFlags & 0x3L) != 0) {
    // api target 1
    this.imageLayout.setVisibility(NotifTypeNotificatio1);
}
imageLayout.executePendingBindings();
Run Code Online (Sandbox Code Playgroud)

Sep*_*X75 62

我想你要做的事情看起来像这样:

在您包含的布局中,指定一个布尔变量并将其绑定到所需视图的可见性

<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>
Run Code Online (Sandbox Code Playgroud)

然后在您的调用布局中绑定您的值

<include
    android:id="@+id/image_layout"
    layout="@layout/image_layout"
    bind:isVisible="@{notification.notifType == 0}"/>
Run Code Online (Sandbox Code Playgroud)

  • 它们都是不同的,转换不以视图为参数,但绑定适配器会。此外,BindingConversion 使用现有属性 (android:xx) 而适配器更多地创建新属性,如 app:imageUrl @CarsonJ (2认同)

aps*_*mer 11

不需要数据绑定,而是获取对<include>布局的根视图的引用并设置其可见性。例如,

binding.myIncludeLayout.root.visibility = View.VISIBLE


Mak*_*aks 7

这有点晚了,但我最近遇到了这个。

我相信这实际上是数据绑定编译器中的一个错误,因为可以直接android:visibility<include>标签上设置属性(即没有数据绑定)。


小智 7

尝试:

this.imageLayout.getRoot().setVisibility(NotifTypeNotificatio1);
Run Code Online (Sandbox Code Playgroud)

  • 在代码背后发布解释很有用,比如它做了什么以及问题出在哪里。 (3认同)

Khe*_*raj 6

最好的办法

  1. 可以直接传递likeInteger的值visibility
  2. visibility您也可以通过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>
Run Code Online (Sandbox Code Playgroud)

并使用像

<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>
Run Code Online (Sandbox Code Playgroud)


Edi*_*sar 6

更好的办法。

在顶部布局上,声明布尔值或可观察字段,其值可切换所包含布局的可见性。然后记得给包含的布局一个 id 否则它不会工作

<?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"
    xmlns:tools="http://schemas.android.com/tools">
    <data>
        <import type="android.view.View"/>
        <variable
            name="show"
            type="Boolean" />
    </data>
    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:background="@color/colorPrimary">


        <include layout="@layout/progress"
            android:id="@+id/progress"
            android:visibility="@{show?View.VISIBLE:View.GONE}"/>

    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>
Run Code Online (Sandbox Code Playgroud)

  • `然后记得给包含的布局一个 id,否则它不会工作` 它不工作的全部原因。非常有用的答案:) (3认同)

Ton*_*Lip 6

为了提供包含标记中的可见性,即使没有数据在包含的布局上传递,您也需要将包含的布局转换为数据绑定。

<layout xmlns:android="http://schemas.android.com/apk/res/android">

    <data>

    </data>
    <LinearLayout
        android:id="@+id/myblock"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/main_bg_alternative"
        android:orientation="vertical"
        android:paddingTop="15dp"
        android:paddingBottom="20dp">
    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
   <TextView
        android:layout_width="wrap_content"
        android:text="@string/hello"
        android:layout_height="wrap_content"/>
   </LinearLayout>
</layout>
Run Code Online (Sandbox Code Playgroud)

在您的活动 XML 上,您可以将可见性用作

<include
     layout="@layout/include_body"
     android:visibility="@{results.size()>0 ? View.VISIBLE : View.GONE, default=gone}"
     tools:visibility="visible" />
Run Code Online (Sandbox Code Playgroud)


yoA*_*ex5 5

您可以通过"http://schemas.android.com/apk/res-auto"名称空间将所有必要的参数从父xml传递到包含的xml中。

语法是 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>
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)