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

Android数据绑定:include标记的可见性,android,android-databinding,Android,Android Databinding,根据,我们可以在可见性中使用以下简单表达式: <TextView .. android:visibility="@{user.isAdult ? View.VISIBLE : View.GONE}"/> 然后Studio不仅以红色显示表达式,而且在构建时,它在自动生成的绑定类中给出以下错误: 错误:(138,29)错误:找不到符号方法setVisibility(int) 这里是自动生成的绑定类中发生错误的地方 // batch finished if ((dirtyFlags &a

根据,我们可以在可见性中使用以下简单表达式:

<TextView
..
android:visibility="@{user.isAdult ? View.VISIBLE : View.GONE}"/>
然后Studio不仅以红色显示表达式,而且在构建时,它在自动生成的绑定类中给出以下错误:

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

这里是自动生成的绑定类中发生错误的地方

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

我想你要做的事情会是这样的:

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


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


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

语法是
例如
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>

包括_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>

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

我认为这实际上是数据绑定编译器中的一个bug,因为可以直接在
标记上设置
android:visibility
属性(即,无需数据绑定)。

最佳方法
  • 您可以直接传递
    可见性的
    整数
  • 您还可以通过在绑定中设置
    default=gone
    来设置
    可见性的默认值
  • 例如,这是
    included\u 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>
    
    
    
    试试:

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

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

    例如在科特林

    binding.root.findViewById(R.id.layout\u inclulded)。可见性=视图。消失了

    在哪里,

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

    cardwiew
    是我的案例中包含的布局的根元素


    R.id.layout\u inclulded
    是父版面中包含版面的
    id

    谢谢大家,您帮了我很多。你的回答是我在这场麻烦中成功的一部分

    我们想设置图像视图的可见性,这也是一些动画的目标。运动场景正在进行可见性管理。将运动属性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>
    

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

    <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>
    
    轰!OP错误侵入了我的整个BuildOutput跟踪,这是一个有趣的Android世界

    在顶部布局上,声明布尔值或可观察字段,其值切换所包含布局的可见性。然后记得给包含的布局一个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>
    

    我遇到了同样的错误。数据绑定可用于除包含的布局之外的每个视图元素

    没有必要对此进行变通,我所做的是用
    标记包围了包含的布局的根,并在其中放置了一个折叠的
    标记-初始化包含的布局以进行数据绑定


    瞧!它起作用了。

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

    <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" />
    
    
    
    我怀疑您需要将
    android:visibility
    表达式放在
    image\u布局
    资源的根视图上,传递
    通知
    通知。notifType
    @commonware Yep。成功了。但是包含的布局是可重用的,所以我不太喜欢在该布局的根视图中设置可见性。毫无疑问,它降低了可读性。在include标记本身上获得可见性将非常好。通过绑定转换,您不必拥有
    @{isVisible?View.VISIBLE:View.GONE}
    ,可以摆脱
    @{isVisible}
    @BindingConversion fun convertBooleanToVisibility(VISIBLE:Boolean):Int{return if(VISIBLE)View.VISIBLE else View.GONE}
    它不是绑定适配器吗?不熟悉BindingConversion,但绑定适配器的功能与您描述的差不多。@iamsujan两者不同,转换不以视图作为参数,但绑定适配器可以。此外,BindingConversion与现有属性一起工作(android:xx)而适配器更适合创建新属性,如app:imageUrl@CarsonJ@iamsujan这真的很糟糕!我必须研究一下。在代码后面贴一个解释是很有用的,比如它做了什么,问题在哪里。最好的解决方案!!通过这种方法,我被称为具有空视图的绑定适配器…
    ,然后记得为包含的布局指定一个id,否则它将无法工作
    说明它无法工作的全部原因。非常有用的回答:)这不起作用
    <include
        layout="@layout/layout_errors"
        android:visibility="@{isVisible}"
       />
    
    @BindingAdapter("android:visibility")
        public static void setVisibility(View view, boolean isVisible) {
            view.setVisibility(isVisible ? View.VISIBLE : View.GONE);
        } 
    
    <?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>
    
    <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>
    
    <include
         layout="@layout/include_body"
         android:visibility="@{results.size()>0 ? View.VISIBLE : View.GONE, default=gone}"
         tools:visibility="visible" />