DataBindingでバインドした変数を、includeタグで読み込んでいる他のレイアウトで利用したい


実現したいこと

登場ファイル

  • MainActivity.kt
  • MainViewModel.kt
  • activity_main.xml
  • contents_main.xml

Activity(MainActivity.kt)のレイアウトファイル(activity_main.xml)に、includeタグで他のレイアウトファイル(contents_main.xml)を読み込んでいる場合に、DataBindingを用いてMainActivity.kt <=> MainViewModel.kt間でバインドしたデータをcontents_main.xmlで利用したい。

解決法

contents_main.xmlで定義した変数をactivity_main.xmlincludeタグ内で渡す

contents_main.xml
<layout>
    <data>
        <variable
            name="foo"
            type="String"/>  
    </data></layout>

上記のように、contents_main.xmlに変数(foo)を定義する。

activity_main.xml
<layout><data>
        <variable
            name="vm"
            type="com.example.MainViewModel" />
    </data>

    <FrameLayout><include
            android:id="@+id/contents"
            layout="@layout/contents_main"
            app:foo="@{vm.hoge}" /> /* ←ココ */ 

    </FrameLayout>
</layout>

上記のように、contents_main.xmlで定義した変数(foo)に、MainActivity.kt <=> MainViewModel.kt間でバインドしたクラスを利用して値をincludeタグの属性にセット(言い方合ってるかわかりません)する。

contents_main.xml
<layout>
    <data>
        <variable
            name="foo"
            type="String"/>  
    </data>

  <TextView
        
        android:text="@{foo}" /></layout>

これで上記のようにcontents_main.xmlで使えるようになりました!

参考

Data Binding Library
DataBindingのあれこれ