2010-11-29 15 views
5

Mi aplicación consiste en crear encuestas. Para hacerlo, el usuario debería poder crear nuevos campos dinámicamente.Inflar una vista varias veces en el mismo elemento primario cuando se hace clic en un botón

Por lo tanto, al crear una nueva encuesta, se muestra una actividad con solo 2 botones (agregar y eliminar). Cuando un usuario hace clic en el botón Agregar, aparece una fila que contiene un EditText (para que pueda escribir la pregunta), un Spinner (que permite al usuario seleccionar el tipo de campo: texto, RadioButton, CheckBox, etc.) y otro EditText (en el que se escriben las diferentes opciones de respuesta disponibles, si corresponde).

Para lograr esto, creé un archivo XML que contiene estos widgets y cada vez que el usuario hace clic en el botón Agregar, el XML se infla. Funciona la primera vez que presiono el botón, pero después de eso ... no pasa nada.

Leí en alguna parte que no se puede inflar el mismo niño 2 veces en un padre a menos que se haga en un bucle.

Por lo tanto, mis preguntas son:

-> ¿Cómo puedo evitar esto y obtener el efecto deseado?

-> ¿Por qué no se aplica esto en un bucle?

Se agradece cualquier ayuda o sugerencia. Una vez más, muchas gracias por todo el apoyo que la comunidad me ha brindado.

NOTA: En la documentación de Android hablan sobre la clonación de un inflador pero la información allí es escasa y no pude encontrar ninguna otra información al respecto. código

Fuente:

XML - cointainer principal:

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

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

    <Button 
     android:id="@+id/mds_new_addfield_button" 
     android:tag="new" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Add Field" 
     android:layout_alignParentBottom="true" 
     android:layout_alignParentLeft="true" 
    /> 
    <Button 
     android:id="@+id/mds_new_deletefield_button" 
     android:tag="delete" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Delete Field" 
     android:layout_alignParentBottom="true" 
     android:layout_alignParentRight="true" 
    /> 

</RelativeLayout> 

XML -Inflated:

<TableLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
> 
    <TableRow> 
     <TextView 
      android:id="@+id/mdsnew_field_tv" 
      style="@style/dsn_field" 
      android:text="Field Name " 
     /> 

     <TextView 
      android:id="@+id/mdsnew_type_tv" 
      style="@style/dsn_field" 
      android:text="Type of Field " 
     /> 

     <TextView 
      android:id="@+id/mdsnew_choices_tv" 
      style="@style/dsn_field" 
      android:text="Choices" 
     /> 
    </TableRow> 

    <TableRow> 

     <EditText 
      android:id="@+id/mdsnew_fieldname_et" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="Field Name" 
      android:textSize="18sp" 
     /> 

     <Spinner 
      android:id="@+id/mdsnew_type_sp" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
     /> 

     <EditText 
      android:id="@+id/mdsnew_choices_et" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="Choices " 
      android:textSize="18sp" 
     /> 

    </TableRow> 
</TableLayout> 

Añadir Botón:

LinearLayout myRoot = (LinearLayout) findViewById(R.id.wrapper); 

LayoutInflater inflater = (LayoutInflater)this.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

inflater.inflate(R.layout.mds_new_row, myRoot); 
+2

Puede inflar al mismo niño dos o más veces. Lo que no puede hacer es usar la misma instancia de una vista más de una vez. Cada vez que llamas al método 'inflate' de' LayoutInflater' estás creando una nueva 'Vista' por lo que no deberías tener problemas con la forma en que estás haciendo las cosas. Entonces ... puede ser que el error esté en otro lugar ... ¿podría compartir los archivos XML (el contenedor y el que está inflado en tiempo de ejecución)? Además, el fragmento de código donde infle su Vista será útil. – Cristian

+0

¡Editó la publicación para incluir lo que pidió! (¡gracias por su ayuda!) – Tivie

+0

¿Cómo recuperará la identificación de cada vista? – Janmejoy

Respuesta

13

Su padre es un LinearLayout, y parece que tu intención una orientación vertical, pero no ha especificado esto. Intenta establecer la orientación y ver si eso ayuda.

+0

¡Sí! Ese fue el problema. Un millón de gracias. – Tivie

+0

Gracias @xtempore busqué en Google y desperdicié 2 días, luego encontré esta solución. – hchouhan02

+0

No puedo creer que me haya llevado tanto tiempo resolver este problema ... ¡Asumí que la orientación vertical estaba implícita como lo está cuando se definen los elementos en XML! Gracias. –

Cuestiones relacionadas