私のメインアクティビティのレイアウトを記述した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要素にいくつかの属性を設定することによってこれを行う方法はありますか?これを達成するために取るべき最善のアプローチは何でしょうか?
いいえ、<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
}
データバインディングを有効にすると、次のことが可能になります。
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でそのビューを取得し、テキストを変更するサブビューを見つけます。