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)
aps*_*mer 11
不需要数据绑定,而是获取对<include>
布局的根视图的引用并设置其可见性。例如,
binding.myIncludeLayout.root.visibility = View.VISIBLE
这有点晚了,但我最近遇到了这个。
我相信这实际上是数据绑定编译器中的一个错误,因为可以直接android:visibility
在<include>
标签上设置属性(即没有数据绑定)。
小智 7
尝试:
this.imageLayout.getRoot().setVisibility(NotifTypeNotificatio1);
Run Code Online (Sandbox Code Playgroud)
Integer
的值visibility
。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)
更好的办法。
在顶部布局上,声明布尔值或可观察字段,其值可切换所包含布局的可见性。然后记得给包含的布局一个 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)
为了提供包含标记中的可见性,即使没有数据在包含的布局上传递,您也需要将包含的布局转换为数据绑定。
<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)
您可以通过"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)