上記の例は適切に動作します。これは、リリース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'
ボタンを取得する方法は?
問題は、含まれるレイアウトがデータバインドレイアウトとして考えられていないことです。 1つとして機能させるには、変数を渡す必要があります。
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"/>
....
id
を組み込みレイアウトに設定し、binding.includedLayout.anyView
を使用するだけです。
この例は、値を<include
に渡し、コードに含まれるビューにアクセスするのに役立ちます。
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.
このレイアウトを親レイアウトに含めます。含まれるレイアウトに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
でラップする必要があります
これに関する他の興味深いことは、次のようにバインダーからインポートされたレイアウトに変数を渡すことができることです:
MainBinding binding = MainBinding.inflate(getLayoutInflater());
binding.buttons.setVariable(BR.varID, variable)
次のようにIDを追加するだけで、インクルードでバインドを機能させることができます。
<include
Android:id="@+id/loading"
layout="@layout/loading_layout"
bind:booleanVisibility="@{viewModel.showLoading}" />