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


116

更新メモ:

上記の例は適切機能します。リリース1.0-rc4では、不要な変数が必要になるという問題が修正されたためです。

元の質問:

私はそれがドキュメントに記載されているように正確に行いますが、機能しません:

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'

ボタンの入手方法は?

回答:


205

問題は、含まれているレイアウトがデータバインドレイアウトと見なされていないことです。それを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}"/>
....

次に、buttonsフィールドを介して間接的にボタンにアクセスできます。

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

6
1.0-rc4で、不要な変数が必要になる問題が修正されました。簡単に使用できるようになりました<include layout="@layout/buttons" android:id="@+id/buttons"/>。ボタンビューにアクセスできるようにパブリックフィールドを生成するために、IDはまだ必要です。
ジョージマウント

1
レイアウト上のクリックイベントのバインドに問題がある他の誰かがいますか?
Nilzor 2016

5
インクルードのサポートによるデータバインディング。developer.android.com/topic/libraries/data-binding/…–
sowmia

1
ここで覚えておくべき重要な点は、ボタン参照を取得することです。binding.{id of include tag}.button代わりに行う必要がありますbinding.button。それを理解するのにしばらくかかりました。
Rishabh876

1
@NeonWargeの完全な例がありdeveloper.android.com/topic/libraries/data-binding/...が。「データバインディングは、マージ要素の直接の子としてのインクルードをサポートしていません」を追加します
Ewan

38

簡単な完全な例

id含まれるレイアウトに設定して、を使用するだけbinding.includedLayout.anyViewです。

この例は<include、コードに含まれるビューに値を渡し、それに含まれるビューにアクセスするのに役立ちます。

ステップ1

あなたが持っている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.

ステップ2

このレイアウトを親レイアウトに含めます。組み込みidクラスにtoを指定して、バインディングクラスで使用できるようにします。これで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


それは、ボタンとなっているならば、あなたの答えでは、代わりのTextViewの、プログラムでのsetTextイベントを処理し、その後、あなたはそれを知っている.Iそのクリックイベントをプログラムで処理されているだろうか binding.includedLayout.button.setOnClickListener、私が使用したい場合は、代替が、何でしょうonClickXML内の属性それ自体?
iCantC 2019年

OnClickListenerインクルードレイアウトに渡すことができます。バインディングで何でも渡すことができます。この回答を確認してください。さらにサポートが必要な場合は、お知らせください。stackoverflow.com/a/51722829/6891563
ケムラジ

1
これを行うと、の空白フィールドが表示されpassedTextます。唯一の違いは、文字列リソースを<include>に渡してそのままにしたいので、MainActivityコードを含めないことです。なぜそれが常に空白なのですか?
Elliptica

3

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

MainBinding binding = MainBinding.inflate(getLayoutInflater());
binding.buttons.setVariable(BR.varID, variable)

3

次のようにIDを追加するだけで、バインドでバインドを機能させることができます。

<include
            android:id="@+id/loading"
            layout="@layout/loading_layout"
            bind:booleanVisibility="@{viewModel.showLoading}" />

2

インクルードレイアウトのIDを設定するだけです

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

その後

BUTTONSBINDING binding = yourMainBinding.layout;

BUTTONSBINDING res / layout / buttons.xml

今:

binding.button.setText("simple_Way");
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.