Android

[Android] アクティビティ内で動的にフラグメントを生成してレイアウトに追加する

この記事では、アクティビティ内で動的にフラグメントを生成してレイアウトに追加するまでを紹介します。

MainActivity.java と activity_main.xml とMyListFragment.java の3つの役者で簡単なコードを書いてみます。

アクティビティ内で動的にフラグメントを生成する

activity_main.xml

activity_main.xml に、フラグメントの挿入先として LinearLayout@+id/container を宣言します:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:orientation="vertical"
  tools:context="com.rakuishi.samplelistfragment.fragment.MainActivity">

  <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:id="@+id/container"/>

</LinearLayout>

MainActivity.java

次は、MainActivity.java 内でフラグメントを追加するために、FragmentTransaction を利用します。これを開始するためには、FragmentManagerbeginTransaction() メソッドを呼びます。FragmentManager は、getFragmentManager() メソッドで取得しますが、Support Library を使う方法では、getSupportFragmentManager() を使用します。

フラグメントを作成し、Bundle を介してデータを渡しています。フラグメントの準備ができたら、FragmentTransactionadd() メソッドでアクティビティにフラグメントを追加します:

package com.rakuishi.samplelistfragment.fragment;

import android.app.Activity;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.os.Bundle;

public class MainActivity extends Activity {

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

    // 渡すデータを準備する
    String[] kurage = { "プラヌラ", "ポリプ", "ストロビラ", "エフィラ", "稚クラゲ", "成体" };
    Bundle bundle = new Bundle();
    bundle.putStringArray("kurage", kurage);

    // フラグメントを生成
    MyListFragment fragment = new MyListFragment();
    fragment.setArguments(bundle);

    // フラグメントをアクティビティに追加する FragmentTransaction を利用する
    FragmentManager manager = getFragmentManager();
    FragmentTransaction transaction = manager.beginTransaction();
    transaction.add(R.id.container, fragment, "fragment");
    transaction.commit();
  }
}

MyListFragment.java

MyListFragment.java 内で Bundle のデータを受け取って描画します。getArguments() があるか、キー名が存在するか、を確認しておくとアプリがクラッシュするのを防げます。

package com.rakuishi.samplelistfragment.fragment;

import android.app.ListFragment;
import android.os.Bundle;
import android.widget.ArrayAdapter;

public class MyListFragment extends ListFragment {
  @Override
  public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

    if (getArguments() != null && getArguments().containsKey("kurage")) {
      String[] kurage = getArguments().getStringArray("kurage");
      ArrayAdapter adapter = new ArrayAdapter(getActivity(), android.R.layout.simple_list_item_1, kurage);
      setListAdapter(adapter);
    }
  }
}

実行結果

下図左が実行結果となります。右は、MyListFragment.java 内で何も setListAdapter() しなかった場合の表示です。何も描画されない場合は、ローディング中になるんですね。