[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
を利用します。これを開始するためには、FragmentManager
の beginTransaction()
メソッドを呼びます。FragmentManager
は、getFragmentManager()
メソッドで取得しますが、Support Library を使う方法では、getSupportFragmentManager()
を使用します。
フラグメントを作成し、Bundle
を介してデータを渡しています。フラグメントの準備ができたら、FragmentTransaction
の add()
メソッドでアクティビティにフラグメントを追加します:
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()
しなかった場合の表示です。何も描画されない場合は、ローディング中になるんですね。