2012年3月14日水曜日

Android FragmentBreadCrumbs を使ってパン屑リストを作る

API Level 11 からパン屑リストを表示するための ViewGroup である FragmentBreadCrumbs が用意されています。

使い方は
res/layout/main.xml
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:orientation="vertical" >  
  6.   
  7.     <android.app.FragmentBreadCrumbs  
  8.         android:id="@+id/bread_crumbs"  
  9.         android:layout_width="match_parent"  
  10.         android:layout_height="wrap_content" />  
  11.     ...  
  12. </LinearLayout>  


のようにレイアウトに入れてもいいし、

  1. private FragmentBreadCrumbs mFragmentBreadCrumbs;  
  2.   
  3. @Override  
  4. public void onCreate(Bundle savedInstanceState) {  
  5.     super.onCreate(savedInstanceState);  
  6.     setContentView(R.layout.main);  
  7.       
  8.     mFragmentBreadCrumbs = new FragmentBreadCrumbs(this);  
  9.     ActionBar actionBar = getActionBar();          
  10.     actionBar.setCustomView(mFragmentBreadCrumbs);  
  11.     actionBar.setDisplayShowCustomEnabled(true);  
  12.     actionBar.setDisplayShowTitleEnabled(false);  
  13.       
  14.     ...  
  15. }  


のように ActionBar の CustomView として表示してもいい。

FragmentBreadCrumbs のリファレンスには ActionBar.setCustomView(View) を使って Action Bar に配置する目的のものです、とあるので Action Bar に置くのがいいのかな。
まぁでも iosched とかは普通にレイアウトに置いてるので、Action Bar に置かなくてもいいと思う。

setActivity(Activity a) で activity のインスタンスをセットして使う。

  1. private FragmentBreadCrumbs mFragmentBreadCrumbs;  
  2.   
  3. @Override  
  4. public void onCreate(Bundle savedInstanceState) {  
  5.     super.onCreate(savedInstanceState);  
  6.     setContentView(R.layout.main);  
  7.       
  8.     mFragmentBreadCrumbs = new FragmentBreadCrumbs(this);  
  9.     ActionBar actionBar = getActionBar();          
  10.     actionBar.setCustomView(mFragmentBreadCrumbs);  
  11.     actionBar.setDisplayShowCustomEnabled(true);  
  12.     actionBar.setDisplayShowTitleEnabled(false);  
  13.   
  14.     mFragmentBreadCrumbs.setActivity(this);  
  15.     mFragmentBreadCrumbs.setMaxVisible(3);  
  16.     mFragmentBreadCrumbs.setParentTitle("preParent""preSP"null);  
  17.     mFragmentBreadCrumbs.setTitle("preTitle""preST");  
  18.     mFragmentBreadCrumbs.setOnBreadCrumbClickListener(new FragmentBreadCrumbs.OnBreadCrumbClickListener() {  
  19.           
  20.         @Override  
  21.         public boolean onBreadCrumbClick(BackStackEntry backStack, int flags) {  
  22.             if(backStack != null) {  
  23.                 Log.d("onBreadCrumbClick", backStack.getName() + ", " + flags);  
  24.             }  
  25.             return false;  
  26.         }  
  27.     });  


setMaxVisible(int max) メソッドで最大表示数を指定できる。

setMaxVisible() で 3 を指定した状態


最大表示数を指定していない状態


setParentTitle(CharSequence title, CharSequence shortTitle, View.OnClickListener listener) でパン屑リストの初期位置での親エントリのタイトルをセットできる。オプショナル。
shortTitle がどこで使われるのかはよくわからなかった。
第3引数でパン屑リストのこの親タイトルがタップされたときにリスナーをセットできる。

setTitle(CharSequence title, CharSequence shortTitle) で現在の位置でのパン屑リストのタイトルをセットできる。

setOnBreadCrumbClickListener(FragmentBreadCrumbs.OnBreadCrumbClickListener listener) でパン屑リストがタップされたときのリスナーをセットできる。パン屑リストの内の親エントリのどれかがタップされると、FragmentBreadCrumbs.OnBreadCrumbClickListeneronBreadCrumbClick(BackStackEntry backStack, int flags) が呼ばれ、第1引数で関連づけられている BackStackEntry が渡される。BackStackEntry は back stack で保持されるエントリで、FragmentTransaction.addToBackStack() によって生成され、FragmentManager が管理する。FragmentManager.getBackStackEntryAt() で取得することができる。



FragmentTransaction で、back stack に入れる BackStackEntry に FragmentBreadCrumbs のタイトルをセットできる。

  • setBreadCrumbShortTitle(int res)
    このトランザクションが back stack 上にあるときにパン屑リストに表示されるショートタイトルのリソースIDをセットする
  • setBreadCrumbShortTitle(CharSequence text)
    このトランザクションが back stack 上にあるときにパン屑リストに表示されるショートタイトルをセットする デバイスの言語設定が変わった場合に、文字をあとから変えることができないので推奨されていない
  • setBreadCrumbTitle(int res)
    このトランザクションが back stack 上にあるときにパン屑リストに表示されるタイトルのリソースIDをセットする
  • setBreadCrumbTitle(CharSequence text)
    このトランザクションが back stack 上にあるときにパン屑リストに表示されるタイトルをセットする デバイスの言語設定が変わった場合に、文字をあとから変えることができないので推奨されていない


  1. @Override  
  2. public void onClick(View v) {  
  3.     FragmentManager manager = getFragmentManager();  
  4.     FragmentTransaction ft = manager.beginTransaction();  
  5.   
  6.     MainFragment2 fragment = MainFragment2.getInstance();  
  7.   
  8.     int id = v.getId();  
  9.     switch (id) {  
  10.         case R.id.add_btn: {  
  11.             ft.setBreadCrumbShortTitle("sTitle");  
  12.             ft.setBreadCrumbTitle("Title");  
  13.             ft.addToBackStack("MainFragment2");  
  14.             ft.add(R.id.container, fragment, "MainFragment");  
  15.             break;  
  16.         }  
  17.         case R.id.remove_btn: {  
  18.             if(manager.getBackStackEntryCount() > 0) {  
  19.                 manager.popBackStack();  
  20.                 ft.remove(fragment);  
  21.             }  
  22.             break;  
  23.         }  
  24.   
  25.         ...  
  26.     }  
  27.   
  28.     ft.commit();  
  29. }  

addToBackStack() とひもづくので戻るボタンを押して戻すと、パン屑リストもちゃんと一段もどる。

ちなみに FragmentBreadCrumbs のデフォルトのスタイルは Widget_FragmentBreadCrumbs で定義されていて、styles.xml ではこんな感じ
  1. 677     <!-- Default style for {@link android.app.FragmentBreadCrumbs} view. -->  
  2. 678     <style name="Widget.FragmentBreadCrumbs">  
  3. 679         <item name="android:padding">4dp</item>  
  4. 680         <item name="android:animateLayoutChanges">true</item>  
  5. 681     </style>  
ViewGroup なので LayoutTransition でパン屑リストが変わるときにもっと複雑なアニメーションをつけることも可能。



0 件のコメント:

コメントを投稿