Webページなどで、表示中のページの階層構造を表示する為にパンくずリスト(BreadCrumbs)を利用することがあります。
Androidでも、FragmentBreadCrumbsクラスを利用することで、パンくずリストを利用し、画面の階層などを解りやすく表示することができます。
本エントリでは、FragmentBreadCrumbsを利用して、ActionBarにパンくずリストを表示する方法を紹介していきます。
FragmentBreadCrumbsはその名の通り、Fragmentと強く結びついているため、特定ActivityへのFragmentの追加を読み取り、自動でパンくずリストを表示してくれます。
それではつづきをどうぞ。
サンプルアプリケーションの構成
まず始めに、パンくずリストを紹介するためのサンプルアプリケーションを紹介します。
本エントリでは、上図の「アプリケーション起動時の画面」を初期状態と呼んでいます。
初期状態では、Defaultのパンくずが表示されていますが、新たにActivityにFragmentが追加されるまでdisable状態となっています。
この状態で、「AddA」や「AddB」のボタンを押下すると、以下の画面に遷移します。
上図のように、各ボタンを押下した回数だけ、正方形のFragmentとパンくずが追加されていきます。
複数のFragmentを追加した後に、ActionBarのパンくずを押下すると、その時の状態を復元します。
Defaultの右隣の「A」を押下した時には以下画面に遷移します。
追加されていた各Fragmentが無くなり、初期状態にAを追加した状態が復元されます。
それでは、このアプリケーションの動作に習って、FragmentBreadCrumbsの使い方を紹介していきます。
ActionBarにFragmentBreadCrumbsを追加する
FragmentBreadCrumbsをカスタムViewとしてActionBarにセットすることで、ActionBar内にFragmentBreadCrumbsを表示することができます。
ActionBarへのカスタムViewのセットにはActionBarクラスのsetCustomViewメソッドを利用します。
カスタムViewを利用するためには、setDisplayShowCustomEnabledメソッドを利用して、カスタムViewの表示設定をtureにしておく必要がありますので気をつけましょう。
ActionBarへFragmentBreadCrumbsをセットするサンプルコードは以下の通りになります。
private FragmentBreadCrumbs mFragmentBreadCrumbs; @Override public void onCreate(Bundle savedInstanceState) { // 省略... // ActionBarの取得 final ActionBar mActionBar = getActionBar(); // ActionbarにFragmentBreadCrumbsをセット mFragmentBreadCrumbs = new FragmentBreadCrumbs(this); mActionBar.setCustomView(mFragmentBreadCrumbs); mActionBar.setDisplayShowCustomEnabled(true); // パンくず表示の為ActionBarのタイトルを非表示に mActionBar.setDisplayShowTitleEnabled(false);
12行目でFragmentBreadCrumbsをActionBarに追加、13行目でカスタムViewの表示設定をtrueに設定しています。
また、16行目ではActionBarにパンくずリストを表示するため、ActionBarの標準状態で表示しているタイトルの表示をfalseに変更しています。
パンくずの内容を設定する
FragmentBreadCrumbsを使用するためには、「FragmentBreadCrumbsをActivityにセット」を行う必要があります。
FragmentBreadCrumbsをActivityへセットする為には、setActivityメソッドを利用します。この操作を忘れた場合、Null Pointer Exceptionが発生してしまいますので注意しましょう。
また、setParentTitleメソッドを使って初期状態を示すパンくず(スクリーンショットでのDefaultボタン)を表示することができます。
setParentTitleメソッドにはView.OnClickListenerを渡すことができます。
OnClickListenerには、初期状態のパンくずをタッチした時の処理を記述できます。
パンくずの内容を設定する部分に該当するサンプルコードは以下の通りになります。
本エントリでは、初期状態を示すパンくずをタッチした時には、初期状態に戻すための処理を記述しています。
// FragmentBreadCrumbsをActivityにAttachする // (無いとNull Pointer Exceptionになる) mFragmentBreadCrumbs.setActivity(this); // 初期状態を示すBreadCrumbを作成する mFragmentBreadCrumbs.setParentTitle("Default", null, new OnClickListener() { @Override public void onClick(View v) { Toast.makeText(self, "Click ParentTitle", Toast.LENGTH_SHORT).show(); // 初期状態に戻す FragmentManager fm = getFragmentManager(); for (int i = 0; i < fm.getBackStackEntryCount(); i++) { fm.popBackStack(); } } });
3行目でFragmentBreadCrumbsをActivityにセットしています。
setActivityメソッドの引き数には、セットするActivityを引き渡します。
6行目では初期状態のパンくずを作成しています。
setParentTitleメソッドには、表示するパンくずのタイトルを引き渡します。
第三引き数には、タッチした時に呼び出すメソッドを記述しています。
onClickメソッド内で、初期状態へ戻す処理を行っています。
FragmentManagerクラスのgetBackStackEntryCountメソッドを利用すると、バックスタックに入っているFragmentの数を取得することができるので、その数だけpopBackStackメソッドを呼び出し状態を復元しています。
Fragmentをバックスタックに追加する処理については、次項で説明しています。
Fragmentを追加する時にパンくずを追加する
FragmentBreadCrumbsを利用してパンくずを表示するときは、Fragmentの追加や削除をAndroidOSが管理してくれるため、Fragmentに対して複雑な処理を追加する必要はありません。
FragmentTransactionへFragmentを追加する際にパンくずに表示するタイトルを設定するのみです。
タイトルの設定にはFragmentTransactionクラスのsetBreadCrumbTitleメソッドを利用します。
サンプルアプリケーションでは、各ボタンの押下時にFragmentを追加しています。
ボタン押下時の処理とFragmentの実装は以下の通りです。
@Override public void onClick(View v) { SampleFragment fragment = null; switch (v.getId()) { case R.id.button1: // Add Fragment A fragment = new SampleFragment(Color.BLUE, "A"); break; case R.id.button2: // Add Fragment B fragment = new SampleFragment(Color.YELLOW, "B"); break; case R.id.button3: // Add Fragment C fragment = new SampleFragment(Color.GREEN, "C"); break; default: break; } if (fragment != null) { // 選択したFragmentを追加する FragmentTransaction ft = getFragmentManager().beginTransaction(); ft.add(R.id.fragment_root, fragment); ft.addToBackStack(null); // BreadCrumbの名前を追加 ft.setBreadCrumbTitle(fragment.getName()); ft.commit(); } } private class SampleFragment extends Fragment { int colorCode; String name; /** * コンストラクタ FragmentA B C の特徴を入力する * * @param color * Yellow or Blue or Green * @param n * AorBorC */ SampleFragment(int color, String n) { colorCode = color; name = n; } public String getName() { return name; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.fragment_layout, container, false); ((TextView) v.findViewById(R.id.textView1)) .setBackgroundColor(colorCode); ((TextView) v.findViewById(R.id.textView1)).setText(name); return v; } }
27行目でFragmentをバックスタックに追加しています。
30行目でパンくずリストへ追加するタイトルを設定しています。
タイトルは35行目以降で作成しているSampleFragmentクラスのgetNameメソッドから取得するようにしています。
SampleFragmentクラスはコンストラクタに引き渡すカラーコードと文字列を変更することで、A,B,Cと使い分けています。
Fragmentの利用方法の詳細は、Fragmentを動的に変化させるを参考にどうぞ。