web-dev-qa-db-ja.com

インクルードレイアウトの子要素の設定属性

私のメインアクティビティのレイアウトを記述したmain.xmlファイルがあります。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent"
    Android:orientation="vertical" >

    <include layout="@layout/mylayout" />
    <include layout="@layout/mylayout" />
    <include layout="@layout/mylayout" />
    <include layout="@layout/mylayout" />
    <include layout="@layout/mylayout" />
    <include layout="@layout/mylayout" />

</LinearLayout>

含まれているレイアウトxmlファイル(mylayout.xml):

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:id="@+id/mylayout"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:orientation="vertical" >

    <TextView
        Android:id="@+id/textView"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:text="hello world" />

    <Button
        Android:id="@+id/button"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content" />

</LinearLayout>

メインレイアウトに「mylayout」を5回含めたいだけですが、「hello world」を5回表示する代わりに、TextViewにカスタムテキストを含めたいです。

子TextViewのテキストをオーバーライドするためにinclude要素にいくつかの属性を設定することによってこれを行う方法はありますか?これを達成するために取るべき最善のアプローチは何でしょうか?

41
Matt

いいえ、<include>ディレクティブを使用してレイアウトパラメータ以外に、含まれているレイアウトにパラメータを渡す方法はありません。

プログラムでレイアウトを膨らませて、ビューに追加できます。メインレイアウトのコンテナーにIDを追加します。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:id="@+id/container"
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent"
    Android:orientation="vertical" />

次に、アクティビティで:

ViewGroup container = (ViewGroup)findViewById(R.id.container);
for (int i = 0; i < 6; i++) {
    View myLayout = getLayoutInflater.inflate(R.layout.mylayout, null);
    TextView tv = myLayout.findViewById(R.id.textView);
    tv.setText("my layout " + i);
    container.addView(myLayout); // you can pass extra layout params here too
}
17
aromero

データバインディングを有効にすると、次のことが可能になります。

reuse_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <data>
       <variable name="text" type="String"/>
    </data>
    <LinearLayout 
        Android:id="@+id/mylayout"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:orientation="vertical" >

        <TextView
            Android:id="@+id/textView"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:text="@{text}" />

        <Button
            Android:id="@+id/button"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content" />

    </LinearLayout>
</layout>

reuse_layout.xmlを呼び出すときは、それにapp:text属性を追加するだけです

<layout="@layout/reuse_layout" app:text="some tex" />

https://developer.Android.com/training/improving-layouts/reusing-layouts.html

各インクルードのAndroid:idプロパティを設定できます。これにより、含まれるレイアウトのルート要素にIDが付与されます。

IDでそのビューを取得し、テキストを変更するサブビューを見つけます。

5
John Boker