Android - Ajouter dynamiquement des vues dans la vue


Answers

Voir la classe LayoutInflater .

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);
Question

J'ai une mise en page pour une vue -

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

Ce que je veux faire, c'est dans mon activité principale avec une mise en page comme celle-ci

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

Je veux parcourir mon modèle de données et injecter plusieurs vues consistant en la première mise en page dans la mise en page principale. Je sais que je peux le faire en construisant les contrôles complètement dans le code, mais je me demandais s'il y avait un moyen de construire dynamiquement les vues afin que je puisse continuer à utiliser une mise en page plutôt que de tout mettre dans le code.




Pour que la réponse de @Mark Fisher soit plus claire, la vue insérée doit être un fichier xml dans le dossier layout mais sans layout (ViewGroup) comme LinearLayout etc à l'intérieur. Mon exemple

res / layout / my_view.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"/>

Ensuite, le point d'insertion doit être une mise en page comme LinearLayout:

res / layout / activity_main.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>

Ensuite, le code devrait être

@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 raison pour laquelle je publie cette réponse très similaire est que lorsque j'ai essayé d'implémenter la solution de Mark, je me suis retrouvé coincé sur quel fichier xml devrais-je utiliser pour insert_point et la vue enfant. J'ai utilisé la mise en page dans la vue enfant d'abord et ça ne fonctionnait pas du tout, ce qui m'a pris plusieurs heures pour comprendre. J'espère que mon exploration peut sauver le temps des autres.




Related