Search code examples
javaandroiddata-bindingandroid-buttonandroid-databinding

Android Data Binding using include tag


Update note:

The above example works properly, because release 1.0-rc4 fixed the issue of needing the unnecessary variable.

Original question:

I do exactly as it is described in the documentation and it does not work:

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'

how to get button?


Solution

  • The problem is that the included layout isn't being thought of as a data-bound layout. To make it act as one, you need to pass a variable:

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

    Then you can access buttons indirectly through the buttons field:

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

    As of 1.0-rc4 (just released), you no longer need the variable. You can simplify it to:

    buttons.xml:

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

    main.xml:

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