Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Setting attribute of child element of included layout

I have a main.xml file describing the layout of my main activity:

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

and its included layout xml file (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> 

I just want to include "mylayout" in my main layout 5 times, but instead of seeing "hello world" 5 times, I want the TextView to contain custom text.

Is there any way to do this by setting some attribute on the include element to override the child TextView's text? What would be the best approach to take to accomplish this?

like image 238
Matthew Avatar asked Jan 26 '12 02:01

Matthew


2 Answers

No, there is no way to pass parameters to the included layout other than the layout params using the <include> directive.

You can inflate the layout programatically and add them to your view. Add an id to the container in your main layout:

<?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" /> 

Then in your Activity:

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 } 
like image 133
aromero Avatar answered Sep 22 '22 03:09

aromero


It is possible if you enable data binding:

In 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> 

when you call the reuse_layout.xml just add app:text attribute with it

<layout="@layout/reuse_layout" app:text="some tex" /> 
like image 28
theerasan tonthongkam Avatar answered Sep 21 '22 03:09

theerasan tonthongkam