1. ホーム
  2. android

[解決済み] Android - ビューにビューを動的に追加する

2022-04-27 21:38:42

質問

ビューのレイアウトがあります。

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

メインアクティビティで、次のようなレイアウトにしたいのです。

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

データモデルをループして、最初のレイアウトで構成される複数のビューをメインレイアウトに注入したいのです。 コントロールを完全にコード内に構築することによってこれを行うことができることは知っていますが、すべてをコード内に置くのではなく、レイアウトを使い続けることができるように、ビューを動的に構築する方法があるのかどうか疑問に思っていました。

どのように解決するのですか?

を使用します。 LayoutInflater を使用してレイアウトテンプレートに基づいたビューを作成し、必要なビューにそれを注入します。

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

ビューを挿入したい場所のインデックスを調整する必要があるかもしれません。

さらに、親ビューにどのように収めたいかに応じて LayoutParams を設定します。 FILL_PARENT または MATCH_PARENT など。