2012-04-02 8 views
20

En mi actividad de Android, necesito agregar una sola vista dinámicamente (en tiempo de ejecución), en una posición específica en un diseño. La vista que se agregará se determina en tiempo de ejecución. Por ejemplo, puede que el diseño se vea más o menos así:marcador de posición de diseño de Android para vista añadida dinámicamente

<LinearLayout ...> 
    <TextView ... /> 
    <!-- Dynamic item to be added here --> 
    <TextView ... /> 
</LinearLayout> 

¿Cuál es la mejor manera de lograrlo?

Una solución es usar layout.addView(view, index), pero prefiero no codificar el índice.

Otra solución es utilizar un FrameLayout como un marcador de posición, y el lugar puede visión dinámica dentro de la FrameLayout, por ejemplo:

<LinearLayout ...> 
    <TextView ... /> 
    <FrameLayout android:id="@+id/placeholder" /> 
    <TextView ... /> 
</LinearLayout> 

Entonces:

findViewById(R.id.placeholder).addView(view); 

Sin embargo, esto añade una vista innecesario en la jerarquía

¿Cuál sería la forma recomendada de hacerlo?

Respuesta

13

Creo que el uso de FrameLayout como marcador de posición para su vista "agregado en tiempo de ejecución" es una buena solución.

No me preocuparía el impacto de la vista extra "innecesaria" en el rendimiento.

+1

Gracias. Terminé usando 'findViewById (R.id.placeholder) .addView (view);', donde el marcador de posición puede ser un FrameLayout, o cualquier otro diseño si la vista solo debe agregarse al final, como ScrollView. – Ralf

+0

puede obtener un árbol profundo de vistas anidadas así, lo que puede dar lugar en algunos casos a un error grave, debido al tamaño de pila limitado para el subproceso UI –

7

También puede lograr este comportamiento de "inclusión diferida" utilizando un ViewStub, como se describe en este (bastante antiguo) article de los Desarrolladores de Android.

+1

Para "incluir perezoso" debe especificar el archivo de diseño para incluir en tiempo de compilación, pero necesito poder agregar una de varias vistas (determinada en tiempo de ejecución). Edité la pregunta para aclarar. – Ralf

+1

El archivo de diseño especificado en ViewStub puede ser un LinearLayout vacío, RelativeLayout, ... WhateverLayout que se puede rellenar dinámicamente con cualquier cantidad de .AddView(). No veo por qué esto no funcionaría como mencionaste anteriormente (actualmente estoy implementando esto) – samosaris

+2

ViewStub stub = (ViewStub) findViewById (R.id.container_stub); stub.setLayoutResource (R.layout.activity_home); – frostymarvelous

1

Puede usar addView (Ver índice secundario, int) sin una codificación estricta del índice exacto.

Si se puede reparar uno de los vecinos de la vista (por ejemplo, hay una etiqueta específica justo antes del lugar donde desea insertar el elemento), puede obtener el índice de esa vista e insertar su vista dinámica después de eso:

View previousView = findViewById(ID_OF_PREVIOUS_VIEW); 
ViewGroup parent = (ViewGroup)previousView.getParent(); 
int previousIndex = parent.indexOfChild(previousView); 
parent.addView(theDynamicallyCreatedView, previousIndex + 1); 

o puede utilizar un ViewStub, pero en lugar de inflar un diseño, simplemente eliminarlo:

View placeholder = findViewById(ID_OF_STUB); 
ViewGroup parent = (ViewGroup)previousView.getParent(); 
int index = parent.indexOfChild (placeholder); 
parent.removeViewAt(index); 
parent.addView(theDynamicallyCreatedView, index); 

de esta manera no va a terminar con una enorme jerarquía de vistas.

Cuestiones relacionadas