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