安卓数据绑定使用包含标记

更新说明:

上面的示例工作正常,因为 1.0-rc4 版修复了需要不必要的变量的问题。

原始问题:

我完全按照文档中描述的方式进行操作,并且它不起作用:

主要.xml:

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

按钮.xml:

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

我的活动.java:

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

如何获取按钮?


答案 1

问题在于,包含的布局未被视为数据绑定布局。要使它作为一个整体,你需要传递一个变量:

按钮.xml:

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

主要.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(刚刚发布)开始,您不再需要该变量。您可以将其简化为:

按钮.xml:

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

主要.xml:

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

答案 2

简单完整的示例

只需设置为包含的布局,然后使用 .idbinding.includedLayout.anyView

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

步骤1

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

您将在布局中创建变量并将其引用到 。StringStringTextView

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

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

第 2 步

将此布局包括到父布局中。为包含的布局提供一个 id,以便我们可以在绑定类中使用它。现在,您可以将 String 传递给您的代码。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


推荐