使用数据绑定从手动膨胀的视图访问父视图ID

时间:2016-09-09 13:46:15

标签: android data-binding android-databinding

我有一个线性布局,我在运行时膨胀视图。包含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的可见性?

1 个答案:

答案 0 :(得分:0)

我发现你的问题有点棘手。我使用数据绑定生成过程(https://developer.android.com/topic/libraries/data-binding/index.html)的核心过程很少来实现您的问题。

  1. 绑定数据中生成的绑定类(https://developer.android.com/topic/libraries/data-binding/index.html#binding_data
  2.   

    默认情况下,将根据的名称生成Binding类   布局文件,将其转换为Pascal案例和后缀&#34; Binding&#34;至   它。上面的布局文件是main_activity.xml所以生成类   是MainActivityBinding。

    这意味着在将布局标记添加到xml中的同时,也会创建相应的Binding类。

    1. 使用视图ID获取视图的最终实例(https://developer.android.com/topic/libraries/data-binding/index.html#views_with_ids
    2.   

      将为每个具有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>