Fragment の入れ替えのサンプル(2)

ListFragment 継承したメニュー形式のフラグメントと、コンテンツ表示用のフラグメントを組み合わせて
コンテンツ表示中の項目に相当するメニューの項目を選択状態(選択色を割り当てる)にした場合、
BACKキーで戻った時に、コンテンツのフラグメントだけ戻ってしまう。
この戻り操作で、メニューの項目の選択状態もきちんと連動させるには、
FragmentManager の addOnBackStackChangedListener を使用する。

例)

ListFragment の継承、(途中省略あり!)

public class MenuListFragment extends ListFragment{
   @Override
   public void onActivityCreated(Bundle savedInstanceState){
      super.onActivityCreated(savedInstanceState);
      setRetainInstance(true);
      this.setListAdapter(new ArrayAdapter<String>(getActivity(), R.layout.menu_row, menues));
      getListView().setChoiceMode(AbsListView.CHOICE_MODE_SINGLE);
   }
   @Override
   public void onListItemClick(ListView l, View v, int position, long id){
      Fragment fragment = null;
      switch(position){
      case 0:
         fragment = new Section1Fragment();
  <<< 省略  >>>
      default:   return;
      }
      FragmentTransaction transaction = getFragmentManager().beginTransaction();
      transaction.replace(R.id.container, fragment, "container");
      transaction.addToBackStack(null);
      transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
      transaction.commit();
   }
   /**
    * BACKキーで content 切替わり時に実行する
    * @param position = -1 で未選択にする
    */

   public void setChecked(int position){
      if (position < 0){
         getListView().setItemChecked(getListView().getCheckedItemPosition(), false);
      }else{
         getListView().setItemChecked(position, true);
      }
   }

}
------------------------------

Activity の onCreate で、以下のように、タグ名"container" で、コンテンツを割り当てる。

FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.add(R.id.container, new Fragment(), "container");
transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
transaction.commit();

続けて onCreate で、BACKキーによるフラグメントのスタックからコンテンツが戻ったときのリスナを設定する。


final FragmentManager fmanager = getFragmentManager();
fmanager.addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener(){
   @Override
   public void onBackStackChanged(){

      Fragment f = fmanager.findFragmentByTag("container");
      // ListFragment継承の Fragment を参照して、
      // リストの選択状態をコンテンツに合わせて選択する。

      MenuListFragment menu = (MenuListFragment)fmanager.findFragmentById(R.id.menuFragment);
      if (f instanceof Section1Fragment){
         menu.setChecked(0);
      }else if(f instanceof Section2Fragment){
         menu.setChecked(1);
      }else if(f instanceof Section3Fragment){
         menu.setChecked(2);
      }else{
         // 未選択の初期状態に戻った時、android.app.Fragment
         menu.setChecked(-1);
      }
   }
});