我有一个线性布局,我在运行时膨胀视图。包含LinearLayout
的视图也有RadioGroup
。我正在膨胀的视图有EditText
,其可见性取决于RadioGroup
的已检查项目。但是,我无法使用数据绑定访问它。
我的观看文件如下:
content_main.xml:
<RadioGroup
android:id="@+id/radio_type"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:checkedButton="@+id/btn_1"
android:orientation="horizontal">
<RadioButton
android:id="@+id/btn_1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/btn_1" />
<RadioButton
android:id="@+id/btn_2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/btn_2" />
<RadioButton
android:id="@+id/btn_3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/btn_3" />
</RadioGroup>
...
<android.support.v4.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" />
</android.support.v4.widget.NestedScrollView>
我在container
中展示的布局xml有EditText
,如下所示:
list_item_content_main.xml
...
<EditText
android:id="@+id/number"
android:visibility="@{btn3.checked ? View.VISIBLE : View.GONE}" <!-- This line -->
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="end"
android:inputType="numberDecimal|numberSigned"
android:selectAllOnFocus="true" />
...
由于在变量列表中找不到radioType
,编译失败。
如何从膨胀的布局文件中引用radio_type
元素,以便通过使用数据绑定来设置EditText
的可见性?
答案 0 :(得分:0)
我发现你的问题有点棘手。我使用数据绑定生成过程(https://developer.android.com/topic/libraries/data-binding/index.html)的核心过程很少来实现您的问题。
默认情况下,将根据的名称生成Binding类 布局文件,将其转换为Pascal案例和后缀&#34; Binding&#34;至 它。上面的布局文件是main_activity.xml所以生成类 是MainActivityBinding。
这意味着在将布局标记添加到xml中的同时,也会创建相应的Binding类。
将为每个具有ID的视图生成公共最终字段 布局即可。绑定在View层次结构上执行单个传递, 使用ID提取视图。这种机制可以比快 为几个视图调用findViewById。
不要将绑定实例放到包含的布局中,而是尝试为触发器创建一个布尔变量,以使解决方案更灵活。
activity_main.xml中
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:bind="http://schemas.android.com/apk/res-auto"
>
<data>
<import type="android.view.View"/>
</data>
<LinearLayout
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
android:orientation="vertical">
<RadioGroup
android:id="@+id/radio_type"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:checkedButton="@+id/btn_1"
android:gravity="center"
android:orientation="horizontal">
<RadioButton
android:id="@+id/btn_1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="btn_1"/>
<RadioButton
android:id="@+id/btn_2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="btn_2"/>
<RadioButton
android:id="@+id/btn_3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="btn_3"/>
</RadioGroup>
<include layout="@layout/inside"
bind:numberEditShown="@={btn3.checked}"
/>
</LinearLayout>
</layout>
inside.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="numberEditShown"
type="java.lang.Boolean"/>
</data>
<EditText
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/number"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="numberDecimal|numberSigned"
android:selectAllOnFocus="true"
android:visibility="@{numberEditShown? View.VISIBLE : View.GONE}"
tools:showIn="@layout/activity_main"/>
</layout>