web-dev-qa-db-ja.com

タグとdataBindingを含める

includeを使用して、同じビューでレイアウトの1つを複数回使用したい。 TextViewsを含むcustom.xmlがあるとします。

custom.xml

 <LinearLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:padding="10dp"
    Android:orientation="vertical" >

    <TextView
        Android:id="@+id/text1"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content" />

    <TextView
        Android:id="@+id/text2"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content" />
</LinearLayout>

このレイアウトをparent.xmlに複数回含めました:

 <LinearLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:orientation="vertical" >

    <include layout="@layout/custom"
        Android:id="@+id/layout1"/>

    <include layout="@layout/custom"
        Android:id="@+id/layout2"/>
</LinearLayout>

データモデルをこのレイアウトにバインドしたいのですが、問題は2つの異なるデータモデルをlayout1layout2にバインドする方法がわからないことです。これはcustom.xmlです。私の知る限り、XMLレイアウトにこのタグを追加できます。

    <data>
       <variable name="user" type="com.myproject.model.User"/>
   </data>

ただし、2つの異なるデータモデルをcustom.xmlにバインドする必要があります。

私の質問は、1つのビューに含まれるレイアウトを複数回持ち、データバインディングを使用して異なるデータをそれらに渡す方法ですか?データをレイアウトに渡すが、モデルをxmlに静的にバインドしないようなもの。

this 質問も見つかりましたが、これにはまったく同じ問題がありますが、Data BindingはAndroidの新しいバージョンでリリースされているため、データバインディング:ここに、説明のために引用した質問の一部を示します。

たとえば、ビューに3回表示したい、慎重に作成されたレイアウトがあります。これらのインスタンスにはそれぞれ異なる値が必要です。 includeは基本的にそのXMLを取得してここに貼り付けるため、もっと強力なものが必要です。

25
Milad Faridnia

parent.xmlから渡すことができます

<include layout="@layout/custom"
    Android:id="@+id/layout1"
    app:user="@{object of user1`}"/>

<include layout="@layout/custom"
    Android:id="@+id/layout2"
    app:user="@{object of user2`}"/>

ここでは、parent.xmlからUserオブジェクトを渡す必要があります

Custom.xmlに<data>があることを確認してください

<data>
   <variable name="user" type="com.myproject.model.User"/>
</data>

ここ これに関連する詳細な答えは、それを参照してください

42
Ravi Rupareliya

親ビューとしてsetContentView()で使用しているXMLでPOJO名とそのタイプを使用する方法を知っています。次のようにリソースのレイアウトを含める場合は、includeタグに注目する必要があります。

<?xml version="1.0" encoding="utf-8"?>

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

    <data>

        <variable
            name="user"
            type="exapmpe.model.User" />
    </data>

    <Android.support.design.widget.CoordinatorLayout
        xmlns:Android="http://schemas.Android.com/apk/res/Android"
        xmlns:app="http://schemas.Android.com/apk/res-auto"
        xmlns:tools="http://schemas.Android.com/tools"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent">

        <Android.support.design.widget.AppBarLayout
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content"
            Android:theme="@style/AppTheme.AppBarOverlay">

            <Android.support.v7.widget.Toolbar
                Android:id="@+id/toolbar"
                Android:layout_width="match_parent"
                Android:layout_height="?attr/actionBarSize"
                Android:background="?attr/colorPrimary"
                app:popupTheme="@style/AppTheme.PopupOverlay" />

        </Android.support.design.widget.AppBarLayout>

        <include
            layout="@layout/content_main"
            bind:user="@{user}" />

    </Android.support.design.widget.CoordinatorLayout>

</layout>

ここでは、bind属性を使用してオブジェクトを渡し、コンテンツ画面に詳細情報を表示します。 bind:user="@{user}のような両方の場所でオブジェクト名は同じである必要がありますを確認してください。 content_main.xmlは次のようになります。

<?xml version="1.0" encoding="utf-8"?>

<layout>

    <data>

        <variable
            name="user"
            type="exapmpe.model.User" />
    </data>

    <RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
        xmlns:app="http://schemas.Android.com/apk/res-auto"
        xmlns:tools="http://schemas.Android.com/tools"
        Android:id="@+id/content_main" >

        <TextView
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:text="@{user.firstName + user.lastName}" />

    </RelativeLayout>

</layout>
11
Deva

問題は、含まれるレイアウトがデータバインドレイアウトと考えられていないことです。 ここを見て 解決方法を理解してください

2
Lior