Атрибут настройки дочернего элемента включенного макета

У меня есть файл 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 раз, но вместо того, чтобы видеть «привет мир» 5 раз, я хочу, чтобы TextView содержал пользовательский текст.

Есть ли способ сделать это, установив какой-либо атрибут в элементе include, чтобы переопределить текст дочернего TextView? Каким будет наилучший подход для этого?

Нет, нет способа передать параметры включенному макету, кроме параметров макета, с помощью директивы <include> .

Вы можете раздуть макет программно и добавить их в свой вид. Добавьте идентификатор в контейнер в вашем основном макете:

 <?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 } 

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

Вы можете установить свойство android: id каждого из них. Это дает идентификатор корневому элементу планируемого макета.

Получите этот вид по идентификатору, затем найдите подпункт, в который вы хотите изменить текст.

Возможно, если вы включите привязку данных

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> 

Когда вы вызываете reuse_layout.xml, просто добавляйте к нему атрибут «app: text»

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