65

根据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();
4

12 回答 12

81

我想你正在尝试做的事情看起来像这样:

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

<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}"/>
于 2016-03-02T20:00:15.113 回答
8

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

语法是<res-auto_namespace>:<variable_name>例如app:isVisible

例如

<?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>
于 2018-05-08T14:05:08.173 回答
8

尝试:

this.imageLayout.getRoot().setVisibility(NotifTypeNotificatio1);
于 2018-12-17T22:04:44.350 回答
7

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

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

于 2018-07-26T02:29:19.090 回答
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>
于 2020-01-13T18:38:24.087 回答
5

最好的办法

  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>

并使用

<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>
于 2018-08-06T18:25:44.440 回答
4

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

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

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

<include
     layout="@layout/include_body"
     android:visibility="@{results.size()>0 ? View.VISIBLE : View.GONE, default=gone}"
     tools:visibility="visible" />
于 2021-02-06T02:16:51.400 回答
3

我遇到了同样的错误。除包含的布局外,数据绑定正在处理每个视图元素。

没有必要为此制定解决方法,我所做的是我用<layout>标签包围了包含布局的根,并在那里放置了一个折叠的<data/>标签 - 初始化了包含的布局以进行数据绑定。

瞧!有效。

于 2021-02-04T10:09:49.583 回答
3

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

binding.myIncludeLayout.root.visibility = View.VISIBLE

于 2021-07-30T13:22:14.327 回答
2

这是直接的方法,无需在包含的布局内传递变量

<androidx.constraintlayout.widget.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <include
        layout="@layout/layout_errors"
        android:visibility="@{isVisible ? 0:1 }"
       />

</androidx.constraintlayout.widget.ConstraintLayout>

上面的代码就是我所需要的

有趣的是,如果我删除上面的三元运算符并像这样简化它,

<include
    layout="@layout/layout_errors"
    android:visibility="@{isVisible}"
   />

添加具有以下方法的 BindingAdapter 类,

@BindingAdapter("android:visibility")
    public static void setVisibility(View view, boolean isVisible) {
        view.setVisibility(isVisible ? View.VISIBLE : View.GONE);
    } 

繁荣!OP 错误侵入了我的整个 BuildOutput 跟踪,有趣的Android世界

于 2019-12-18T10:45:46.723 回答
1

谢谢大家,你们帮了我很多。你的回答是我在这个问题上取得成功的一部分。

我们想设置图像视图的可见性,这也是一些动画的目标。Motion Scene 负责管理可见性。将运动属性 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>
于 2019-09-23T08:24:17.507 回答
-2

您可以通过其 id 找到包含的布局并使用visibility属性将其隐藏。

例如在 Kotlin 中,

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

在哪里,

root是父布局中根元素的默认属性。

CardView在我的例子中是包含布局的根元素。

R.id.layout_incluldedid父布局中包含的布局。

于 2019-07-15T09:14:42.977 回答