2011-10-27 17 views
24

OK, por lo que entiendo como usar la etiqueta include pero me he encontrado con un problema.Android con los diseños como plantilla para la creación de varias instancias de diseño

Básicamente quiero tener un diseño definido en xml que tiene un par de TextView sy ImageView en él. Luego quiero iterar a través de una matriz y poblar los campos dentro del diseño xml dependiendo de qué está en una matriz (que se llena en el tiempo de ejecución). De este modo, se realizan copias múltiples del diseño xml y se rellenan los campos con datos únicos. Ahora no tengo idea de cómo puede volver a utilizar este LinearLayout de esta manera, ya que el TextView sy el ImageView s tienen una identificación constante y necesito hacer varias copias de este diseño.

¿Hay alguna forma para inflar un recurso y luego hacer una copia de la misma, que podría funcionar ... Así

LinearLayout one = new LinearLayout(inflater.inflate(R.layout.home, container, false)); 

^No hay ningún constructor de esa desgracia.

La única otra forma es hacerlo todo programáticamente pero preferiría tener las propiedades de las vistas y el LinearLayout en xml en lugar de en el código. Es como si quisiera que la LinearLayout fuera una plantilla de la que puedes hacer copias, supongo ... Realmente no estoy seguro si eso es posible.

Respuesta

42

Puede hacer esto fácilmente, solo tiene que descomponerlo. Primero, carga el diseño en el que desea insertar sus vistas dinámicas. Luego, infle su subvista y la rellene tantas veces como lo necesite. Luego, agrega la vista a su diseño principal y finalmente establece la vista de contenido de la actividad en la vista principal.

He aquí un ejemplo:

LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    LinearLayout parent = (LinearLayout) inflater.inflate(R.layout.main, 
      null); 

    for (int i = 0; i < 3; i++) { 
     View custom = inflater.inflate(R.layout.custom, null); 
     TextView tv = (TextView) custom.findViewById(R.id.text); 
     tv.setText("Custom View " + i); 
     parent.addView(custom); 
    } 

    setContentView(parent); 

aquí es el archivo main.xml que estoy insertando en:

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

</LinearLayout> 

y aquí es la vista custom.xml que inflarse, poblar y dinámicamente insertar:

<?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="wrap_content" 
    android:orientation="horizontal" > 

    <LinearLayout 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:orientation="horizontal" > 

     <ImageView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:src="@drawable/ic_launcher" /> 

     <TextView 
      android:id="@+id/text" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" /> 
    </LinearLayout> 

</LinearLayout> 

Espero que este ejemplo ayude!

+0

Muchas gracias! Eso lo resolvió ... Creo que necesito entender las diferentes llamadas de inflado (...). – gunboatmedia

+1

Gracias! Buen ejemplo de infierno también! –

+1

¿Hay alguna manera de simplemente copiar el diseño durante el ciclo en lugar de usar inflator.inflate() en cada iteración? Me parece que inflar es muy caro en comparación con simplemente copiar. –

7

Para annyone todavía en busca de una solución similar, al parecer, también se puede utilizar include directamente en XML y aún así ser capaz de referirse a ellos en código:

LinearLayout row1 = (LinearLayout) findViewById(R.id.row1) 
TextView text1 = row1.findViewById(R.id.text); 

LinearLayout row2 = (LinearLayout) findViewById(R.id.row2) 
TextView text2 = row2.findViewById(R.id.text); 

Fuente: Romain Guy

Cuestiones relacionadas