使用include标签的Android数据绑定(bind)

2020年10月8日 20点热度 0条评论

更新说明:

上面的示例可以正常工作,因为版本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'

如何获得按钮?

解决方案如下:

问题在于所包含的布局没有被视为数据绑定(bind)布局。要使其成为一体,您需要传递一个变量:

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