使用include标记的Android数据绑定

Kam*_*icz 95 java data-binding android android-button android-databinding

更新说明:

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

原始问题:

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

main.xml中:

<layout xmlns:andr...
    <data>
    </data>
       <include layout="@layout/buttons"></include>
....
Run Code Online (Sandbox Code Playgroud)

buttons.xml:

<layout xmlns:andr...>
    <data>
    </data>
    <Button
        android:id="@+id/button"
        ...." />
Run Code Online (Sandbox Code Playgroud)

MyActivity.java:

 ... binding = DataBindingUtil.inflate...
binding.button; ->cannot resolve symbol 'button'
Run Code Online (Sandbox Code Playgroud)

如何获得按钮?

Geo*_*unt 172

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

buttons.xml:

<layout xmlns:andr...>
  <data>
    <variable name="foo" type="int"/>
  </data>
  <Button
    android:id="@+id/button"
    ...." />
Run Code Online (Sandbox Code Playgroud)

main.xml中:

<layout xmlns:andr...
...
   <include layout="@layout/buttons"
            android:id="@+id/buttons"
            app:foo="@{1}"/>
....
Run Code Online (Sandbox Code Playgroud)

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

MainBinding binding = MainBinding.inflate(getLayoutInflater());
binding.buttons.button
Run Code Online (Sandbox Code Playgroud)

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

buttons.xml:

<layout xmlns:andr...>
  <Button
    android:id="@+id/button"
    ...." />
Run Code Online (Sandbox Code Playgroud)

main.xml中:

<layout xmlns:andr...
...
   <include layout="@layout/buttons"
            android:id="@+id/buttons"/>
....
Run Code Online (Sandbox Code Playgroud)

  • 1.0-rc4现在修复了需要不必要变量的问题.您现在可以简单地使用:`<include layout ="@ layout/buttons"android:id ="@ + id/buttons"/>`.您仍然需要id,以便它为您生成一个公共字段,以便您可以访问Button View. (6认同)
  • 数据绑定包括支持.https://developer.android.com/topic/libraries/data-binding/index.html#includes (5认同)
  • 感谢您的建议.我欠你一个人情. (3认同)
  • 还有其他人在布局上绑定点击事件时遇到问题吗? (2认同)
  • 这里要记住的要点是获取按钮引用,你需要做`binding.{id of include tag}.button`而不是`binding.button`。我花了一段时间才弄明白。 (2认同)

Khe*_*raj 26

简单完整的例子

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

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

步骤1

你有layout_common.xml,想要传递String给包含的布局.

您将String在布局中创建变量并将其引用StringTextView.

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

<TextView
    android:id="@+id/textView"
    ...
    android:text="@{passedText}"/> //set field to your view.
Run Code Online (Sandbox Code Playgroud)

第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>
Run Code Online (Sandbox Code Playgroud)
  • 您现在可以binding.includedLayout.textView在课堂上使用.
  • 您可以将任何变量传递给包含的布局,如上所述.

    binding layout

注意-该两种布局(父&包括)应该是<layout,包裹着id

  • 这不能编译。`错误:找不到符号` (4认同)

小智 13

只需为您的包含布局设置一个 id

    <include
        android:id="@+id/layout"
        layout="@layout/buttons" />
Run Code Online (Sandbox Code Playgroud)

然后

BUTTONSBINDING binding = yourMainBinding.layout;
Run Code Online (Sandbox Code Playgroud)

BUTTONSBINDING 是 res/layout/buttons.xml

现在 :

binding.button.setText("simple_Way");
Run Code Online (Sandbox Code Playgroud)


小智 6

你可以让你的绑定在你的包含文件上工作,只需向它添加一个 ID,如下所示:

<include
            android:id="@+id/loading"
            layout="@layout/loading_layout"
            bind:booleanVisibility="@{viewModel.showLoading}" />
Run Code Online (Sandbox Code Playgroud)


小智 5

另一个有趣的事情是,您可以将变量从活页夹传递到导入的布局,如下所示:

MainBinding binding = MainBinding.inflate(getLayoutInflater());
binding.buttons.setVariable(BR.varID, variable)
Run Code Online (Sandbox Code Playgroud)