2010-10-28 12 views
33

Quiero descomponer mi UI en varios diseños XML. El primero sería el diseño principal, y los otros serían los diseños de contenido.Android: ¿Cómo incluir dinámicamente un diseño XML?

Me gustaría poder establecer qué content_layout debe incluirse dinámicamente en tiempo de ejecución, por lo que no quiero establecer "layout="@+layout/content_layout" en mi archivo XML.

Éstos son mis diseños:

main_layout.xml:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="600dp" 
    android:layout_height="800dp" > 

    <TextView 
     android:id="@+id/title" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_alignParentTop="true" /> 

    <include /> <!-- I WANT TO INCLUDE MY CONTENT HERE --> 

    <Button 
     android:id="@+id/cancelButton" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentBottom="true" 
     android:layout_centerHorizontal="true" 
     android:text="Cancel" /> 

</RelativeLayout> 

content_layout.xml:

<?xml version="1.0" encoding="utf-8"?> 
<ListView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/whatever" 
    android:layout_height="wrap_content" 
    android:layout_width="fill_parent" /> 

content_layout2.xml:

<?xml version="1.0" encoding="utf-8"?> 
<ListView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/whatever2" 
    android:layout_height="wrap_content" 
    android:layout_width="fill_parent" /> 

¿Cómo puedo hacer ¿ese?

Gracias!

Respuesta

36
<RelativeLayout android:id="@+id/rl" ... 

En su código:

// get your outer relative layout 
RelativeLayout rl = (RelativeLayout) findById(R.id.rl); 


// inflate content layout and add it to the relative layout as second child 
// add as second child, therefore pass index 1 (0,1,...) 

LayoutInflater layoutInflater = (LayoutInflater) 
     this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);  
rl.addView(1, layoutInflater.inflate(R.layout.content_layout, this, false)); 
+0

Intenté usar addView en otro caso, pero parecía que ambos diseños se superponían entre sí. Segundo hijo significa en el segundo nivel, entonces bajo mi RelativeLayout ¿verdad? ¿Puedo seguir usando referencias como android: layout_belowe = "@ + id/title" en mi diseño de contenido, evento si no están definidos en el mismo archivo XML? Si no, ¿cómo se supone que deben saber cómo insertarlo en el lugar correcto? Gracias – nbarraille

+0

Se agregará donde pones el commend (// QUIERO INCLUIR MI CONTENIDO AQUÍ ????). Para diseños complejos, siempre puede recorrer una vista (grupos) de elementos secundarios a través de getChildCount(), getChildAt() y agregar la vista donde desee. Además, puede establecer una identificación a través de view.setId() en el código y luego referirse a eso. Pero, por supuesto, eso sería, por ejemplo, una constante en su código, no a través de R.id.someId, ya que una identificación asignada a través de código java no está en su archivo R. –

+1

Ok, lo tengo, el índice 1 (segundo hijo) en realidad significa que se insertará entre el título y el botón, 0 habría estado antes del título, etc ... Gracias. – nbarraille

5

Puede intentar usar un ViewStub y simplemente cambiar el diseño que se inflará programáticamente.

This answer discusses using one ViewStub.

+1

Sí, así es como lo hago normalmente, pero al parecer, se supone ViewStubs para ser utilizado para los elementos no se utiliza a menudo. – nbarraille

+0

Si solo cambia entre dos tipos diferentes de vistas de lista, puede simplemente cambiar el adaptador al que se vincula la vista de lista programáticamente (y, por lo tanto, usar diferentes XML de elementos de vista de lista). –

+0

Lamentablemente, tengo varios diseños de contenido, y algunos de ellos son más complejos que eso. – nbarraille

Cuestiones relacionadas