web-dev-qa-db-ja.com

Androidデータバインディング:レイアウトを含めるために変数を渡す方法

Googleドキュメントによると、変数は含まれているレイアウトからインクルードレイアウトのバインディングに渡される可能性がありますが、機能させることはできませんが、データバインディングエラーが発生します**** msg:Identifiersには、XMLファイルからのユーザー定義型が必要です。ハンドラーにはそれがありません。インクルードXMLは次のようになります。

<layout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:bind="http://schemas.Android.com/apk/res-auto">

<data>
    <import type="com.example.FocusChangeHandler"/>

    <variable
        name="handler"
        type="FocusChangeHandler"/>
</data>

<!-- Some other views  --->

   <include
            Android:id="@+id/inputs"
            layout="@layout/input_fields"
            bind:handler="@{handler}"/>        
</layout>

そして、このように含まれているXML:

<layout xmlns:Android="http://schemas.Android.com/apk/res/Android">
<EditText
   Android:id="@+id/nameEdit"       
   Android:layout_width="wrap_content"
   Android:layout_height="wrap_content"       
   Android:onFocusChange="@{handler.onFocusChange}"/>
</layout>

インクルードされたレイアウトから生成されたバインディングクラスを通じてビューを参照できますが、変数を渡しても機能しません。

21
pmellaaho

documentation は、

ここでは、name.xmlとcontact.xmlの両方のレイアウトファイルにユーザー変数が必要です。

私はあなたがこれをあなたのインクルードされたレイアウトに持っているべきだと思います:

    <data>
           <variable name="handler"
                     type="FocusChangeHandler"/>
    </data>
7
Batgard

インクルードレイアウトに値を渡すための<variableを作成するだけです。

似ているapp:passedText="@{@string/app_name}"

インクルードされたレイアウトにStringを渡したいように。 String型の変数を作成します。 StringTextViewに参照してください。たとえば、passedTextを作成しました。

<?xml version="1.0" encoding="utf-8"?>
<layout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    >

    <data>
        // declare fields
        <variable
            name="passedText"
            type="String"/>
    </data>

    <TextView
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:text="@{passedText}"/> //set field to your view.

</layout>

次に、passedTextフィールドを<includeタグに追加します。

<?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
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        >

        <include
            layout="@layout/layout_common"
            app:passedText="@{@string/app_name}" // here we pass any String 
            />

    </LinearLayout>
</layout>

両方のレイアウト(親とインクルード)はbinding layoutであり、<layoutでラップされている必要があります

7
Khemraj

ハードコードされた文字列の場合:

 Android:label="@{`Test 123`}"
3
Gene Bo