使用include标记的Android数据绑定

时间:2015-10-05 11:25:29

标签: java android data-binding android-button android-databinding

更新说明:

以上示例正常运行,因为发布1.0-rc4 已修复需要不必要变量的问题。

原始问题:

我完全按照documentation中描述的那样做,但它不起作用:

main.xml中:

<layout xmlns:andr...
    <data>
    </data>
       <include layout="@layout/buttons"></include>
....

buttons.xml:

<layout xmlns:andr...>
    <data>
    </data>
    <Button
        android:id="@+id/button"
        ...." />

MyActivity.java:

 ... binding = DataBindingUtil.inflate...
binding.button; ->cannot resolve symbol 'button'

如何获得按钮?

7 个答案:

答案 0 :(得分:151)

问题是所包含的布局不被视为数据绑定布局。要使其作为一个,您需要传递一个变量:

<强> buttons.xml:

<layout xmlns:andr...>
  <data>
    <variable name="foo" type="int"/>
  </data>
  <Button
    android:id="@+id/button"
    ...." />

<强> main.xml中:

<layout xmlns:andr...
...
   <include layout="@layout/buttons"
            android:id="@+id/buttons"
            app:foo="@{1}"/>
....

然后您可以通过按钮字段间接访问按钮:

MainBinding binding = MainBinding.inflate(getLayoutInflater());
binding.buttons.button

从1.0-rc4(刚刚发布)开始,您不再需要变量。您可以将其简化为:

<强> buttons.xml:

<layout xmlns:andr...>
  <Button
    android:id="@+id/button"
    ...." />

<强> main.xml中:

<layout xmlns:andr...
...
   <include layout="@layout/buttons"
            android:id="@+id/buttons"/>
....

答案 1 :(得分:17)

轻松完成示例

  

只需将id设置为包含布局,然后使用binding.includedLayout.anyView

此示例有助于将值传递给<include并访问代码中包含的视图。

步骤1

您有 layout_common.xml ,想将String传递到包含的布局。

您将在布局中创建String变量,并将此String引用到TextView

<data>
    // declare fields
    <variable
        name="passedText"
        type="String"/>
</data>

<TextView
    android:id="@+id/textView"
    ...
    android:text="@{passedText}"/> //set field to your view.

步骤2

将此布局包括在父布局中。为包含的布局提供一个 id ,以便我们可以在绑定类中使用它。现在,您可以将字符串passedText传递给<include标记。

activity_main.xml

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

    <LinearLayout
        ..
        >

        <include
            android:id="@+id/includedLayout"
            layout="@layout/layout_common"
            app:passedText="@{@string/app_name}" // here we pass any String 
            />

    </LinearLayout>
</layout>
  • 您现在可以在课程中使用binding.includedLayout.textView
  • 您可以将任何变量传递到上面包含的布局中。

    ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
    binding.includedLayout.textView.setText("text");
    

注意:两种布局(父级和包括在内)都应为binding layout,并用<layout包裹

答案 2 :(得分:6)

只需为您的包含布局设置ID

    <include
        android:id="@+id/layout"
        layout="@layout/buttons" />

然后

BUTTONSBINDING binding = yourMainBinding.layout;

BUTTONSBINDING是res / layout / buttons.xml

现在:

binding.button.setText("simple_Way");

答案 3 :(得分:1)

另一个有趣的事情是你可以从绑定器中将变量传递给导入的布局,如下所示:

MainBinding binding = MainBinding.inflate(getLayoutInflater());
binding.buttons.setVariable(BR.varID, variable)

答案 4 :(得分:1)

您可以像这样向其添加绑定,只需向其添加ID:

<include
            android:id="@+id/loading"
            layout="@layout/loading_layout"
            bind:booleanVisibility="@{viewModel.showLoading}" />

答案 5 :(得分:0)

您的 xml 文件中似乎有空数据标签,请交叉检查,这是导致无法生成包含布局文件的原因

 <data>

</data>

如果您不使用,请删除此标签,将解决问题

答案 6 :(得分:0)

我想补充一下,我遇到了类似的问题。 我的问题是变量名称是标题,与 id 名称相同。 没有编译错误。 (不是 100% 确定这是一个问题,我也清理了项目)

<?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>

    <variable
        name="title"
        type="String" />
</data>
...
<androidx.appcompat.widget.AppCompatTextView
        android:id="@+id/title"...>
<androidx.appcompat.widget.AppCompatTextView>
...
</layout>