web-dev-qa-db-ja.com

Android includeタグを使用したデータバインディング

更新ノート:

上記の例は適切に動作します。これは、リリース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'

ボタンを取得する方法は?

86

問題は、含まれるレイアウトがデータバインドレイアウトとして考えられていないことです。 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"/>
....
161
George Mount

簡単な完全な例

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.

ステップ2

このレイアウトを親レイアウトに含めます。含まれるレイアウトに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でラップする必要があります

22
Khemraj

これに関する他の興味深いことは、次のようにバインダーからインポートされたレイアウトに変数を渡すことができることです:

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}" />
0
Rodrigo Salomao