使用 include 标签的 Android 数据绑定

新手上路,请多包涵

更新说明:

上面的例子 可以正常运行,因为 release 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'

如何获得按钮?

原文由 Kamil Nękanowicz 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.9k
2 个回答

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

按钮.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}"/>
   ...

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

 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"/>
   ....

原文由 George Mount 发布,翻译遵循 CC BY-SA 4.0 许可协议

简单完整的例子

只需将 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

原文由 Khemraj Sharma 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题