include
を使用して、同じビューでレイアウトの1つを複数回使用したい。 TextView
sを含む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つの異なるデータモデルをlayout1
とlayout2
にバインドする方法がわからないことです。これは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を取得してここに貼り付けるため、もっと強力なものが必要です。
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>
ここ これに関連する詳細な答えは、それを参照してください
親ビューとして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>
問題は、含まれるレイアウトがデータバインドレイアウトと考えられていないことです。 ここを見て 解決方法を理解してください