Android: agregue dinámicamente vistas a la vista

6 minutos de lectura

Tengo un diseño para una vista –

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:padding="0px"
    android:orientation="vertical">

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:id="@+id/items_header"
        style="@style/Home.ListHeader" />

    <TextView 
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:id="@+id/items_none"
        android:visibility="gone"
        style="@style/TextBlock"
        android:paddingLeft="6px" />

    <ListView 
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:id="@+id/items_list" />


</LinearLayout>

Lo que quiero hacer es mi actividad principal con un diseño como este

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:padding="0px"
    android:id="@+id/item_wrapper">
</LinearLayout>

Quiero recorrer mi modelo de datos e inyectar múltiples vistas que consisten en el primer diseño en el diseño principal. Sé que puedo hacer esto creando los controles completamente dentro del código, pero me preguntaba si había una forma de crear dinámicamente las vistas para poder seguir usando un diseño en lugar de poner todo en código.

  • Puede verificar la respuesta para este stackoverflow.com/questions/3995215/…

    – Dime cómo

    18 de abril de 2017 a las 6:45


Android agregue dinamicamente vistas a la vista
marca pescador

Utilizar el LayoutInflater para crear una vista basada en su plantilla de diseño y luego inyectarla en la vista donde la necesite.

LayoutInflater vi = (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View v = vi.inflate(R.layout.your_layout, null);

// fill in any details dynamically here
TextView textView = (TextView) v.findViewById(R.id.a_text_view);
textView.setText("your text");

// insert into main view
ViewGroup insertPoint = (ViewGroup) findViewById(R.id.insert_point);
insertPoint.addView(v, 0, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT));

Es posible que deba ajustar el índice donde desea insertar la vista.

Además, configure LayoutParams de acuerdo con cómo le gustaría que se ajuste a la vista principal. por ejemplo, con FILL_PARENTo MATCH_PARENTetc

  • es donde quiera colocar el diseño generado dinámicamente en su vista principal. esa es la parte que debe completar con su propio código.

    –Mark Fisher

    20 de agosto de 2015 a las 10:02


  • Para aquellos que quieran probar esto ahora: el inflador de diseño obtenido como se muestra en la primera línea aún se resuelve pero no parece funcionar, en su lugar use getLayoutInflater()

    – Brendan

    2 de febrero de 2016 a las 17:01

  • Utilizar LayoutInflater vi = getLayoutInflater(); de una actividad para preservar el tema de la actividad que no obtiene de otra manera.

    – akarthik10

    18/02/2016 a las 16:00

  • En mi vista, tengo una vista de texto y una imagen que inicialmente tienen visibilidad = “desaparecido”. Ahora, después de agregar dinámicamente, configuro su visibilidad dentro del bucle, pero no funciona.

    – pa1pal

    4 de junio de 2016 a las 4:55


1646957526 458 Android agregue dinamicamente vistas a la vista
gabriel negut

Ver el LayoutInflater clase.

LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
ViewGroup parent = (ViewGroup)findViewById(R.id.where_you_want_to_insert);
inflater.inflate(R.layout.the_child_view, parent);

Android agregue dinamicamente vistas a la vista
Aleadam

Parece que lo que realmente quiere es un ListView con un adaptador personalizado para inflar el diseño especificado. Usando un ArrayAdapter y el metodo notifyDataSetChanged() usted tiene el control total de la generación y representación de Vistas.

Echa un vistazo a estos tutoriales

Para que la respuesta de @Mark Fisher sea más clara, la vista insertada que se infla debe ser un archivo xml en la carpeta de diseño pero sin un diseño (ViewGroup) como LinearLayout, etc. dentro. mi ejemplo:

res/layout/mi_vista.xml

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/i_am_id"
    android:text="my name"
    android:textSize="17sp"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_weight="1"/>

Luego, el punto de inserción debe ser un diseño como LinearLayout:

res/layout/actividad_principal.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/aaa"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:id="@+id/insert_point"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    </LinearLayout>

</RelativeLayout>

Entonces el código debe ser

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_shopping_cart);

    LayoutInflater inflater = getLayoutInflater();
    View view = inflater.inflate(R.layout.my_view, null);
    ViewGroup main = (ViewGroup) findViewById(R.id.insert_point);
    main.addView(view, 0);
}

La razón por la que publico esta respuesta muy similar es que cuando traté de implementar la solución de Mark, me quedé atascado en qué archivo xml debo usar para insert_point y la vista secundaria. En primer lugar, utilicé el diseño en la vista infantil y no funcionaba en absoluto, lo que me llevó varias horas descubrir. Así que espero que mi exploración pueda ahorrar el tiempo de otros.

Android agregue dinamicamente vistas a la vista
Tiananhvn

// Parent layout
LinearLayout parentLayout = (LinearLayout)findViewById(R.id.layout);

// Layout inflater
LayoutInflater layoutInflater = getLayoutInflater();
View view;

for (int i = 1; i < 101; i++){
    // Add the text layout to the parent layout
    view = layoutInflater.inflate(R.layout.text_layout, parentLayout, false);

    // In order to get the view we have to use the new view with text_layout in it
    TextView textView = (TextView)view.findViewById(R.id.text);
    textView.setText("Row " + i);

    // Add the text view to the parent layout
    parentLayout.addView(textView);
}

  • Si bien este fragmento de código puede ser la solución, incluyendo una explicación realmente ayuda a mejorar la calidad de su publicación. Recuerde que está respondiendo la pregunta para los lectores en el futuro, y es posible que esas personas no conozcan los motivos de su sugerencia de código.

    – yivi

    24 de octubre de 2017 a las 10:23

  • ¿Está funcionando, pero después de eso solo obtiene la última ID de vista de texto?

    – Sandeep Parek

    2 de julio de 2021 a las 6:59

  • Si bien este fragmento de código puede ser la solución, incluyendo una explicación realmente ayuda a mejorar la calidad de su publicación. Recuerde que está respondiendo la pregunta para los lectores en el futuro, y es posible que esas personas no conozcan los motivos de su sugerencia de código.

    – yivi

    24 de octubre de 2017 a las 10:23

  • ¿Está funcionando, pero después de eso solo obtiene la última ID de vista de texto?

    – Sandeep Parek

    2 de julio de 2021 a las 6:59

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad