タブモードの解説の前に、ActionBarのモードについて説明します。ActionBarには、3つのモードがあります。
モード変数名 | 意味 |
---|---|
NAVIGATION_MODE_STANDARD | 通常モード |
NAVIGATION_MODE_TABS | タブモード |
NAVIGATION_MODE_LIST | リストモード |
ActionBarに何も設定しなければ通常モードになります。タブモードは、Fragmentをタブによって切り替えるモードです。リストモードは、ActionBarにプルダウンを持たせることが可能なモードです。それぞれのモードは排他的なのですが、ActionBarは各モードの状態を切り替えた後も保持しています。
タブモード時以外でもタブの操作は可能で、今回のアプリでも一部のタブ操作がリストモードで行えるようにしてあります。
ただし、タブモード以外でタブ操作を行うと、タブが増えたり減ったりなどの見た目に反映されないため、お勧めしません。
タブを動的に追加するには以下のように行います。
int count = mSectionsPagerAdapter.getCount(); mActionBar.addTab(mActionBar.newTab() .setText(mSectionsPagerAdapter.getPageTitle(count)) .setTabListener(this)); mSectionsPagerAdapter.setCount(count + 1);
ADTのウィザードで生成するひな型は、FragmentPageAdapterを継承したSectionPageAdapterというクラスでタブの管理を行っています。
タブを追加する際には、この管理クラスに対してページタイトルを問い合わせたり、タブ数を増加させたりしています。
このサンプルでは、タブの追加位置は常に最後(右側)ですが、追加位置の指定も可能です。
タブを動的に削除するには以下のように行います。
int count = mSectionsPagerAdapter.getCount(); mActionBar.removeTabAt(count - 1); mSectionsPagerAdapter.setCount(count - 1);
最後のタブを削除して、管理するタブ数を減らしています。インデックスではなく、タブそのものを指定して削除することも可能です。
タブを選択するには以下のように行います。
ActionBar.Tab tab = mActionBar.getTabAt(count - 1); if (System.currentTimeMillis() % 2 == 0) { tab.select(); } else { mActionBar.selectTab(tab); }
最後のタブを選択する実装です。ActionBar.Tab#select()でもActionBar#selectTab(ActionBar.Tab)でもどちらでも結果は同じです。
タブにアイコンを設定・解除するには以下のように行います。
if (mActionBar.getNavigationMode() == ActionBar.NAVIGATION_MODE_TABS) { ActionBar.Tab tab = mActionBar.getSelectedTab(); Drawable d = tab.getIcon(); if (d == null) { tab.setIcon(R.drawable.ic_launcher); } else { tab.setIcon(null); } }
アイコンが設定されていなければ設定し、設定されていれば解除しています。ActionBarのモードがタブモードのときのみ処理するようにしています。これはActionBar#getSelectedTab()がタブモード以外では例外を出すためです。
ActionBar.TabListenerを実装することで、タブ切り替え時のイベントコールバックを受け取れるようになります。
@Override public void onTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) { } @Override public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) { } @Override public void onTabReselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) { }
onTabSelected、onTabUnselected、onTabReselectedが実装すべきリスナーのメソッドです。
例えば、SECTION 1からSECTION 2へスワイプで切り替えた場合、onTabUnselectedはSECTION 1で、onTabSelectedはSECTION 2で呼び出されます。その状態でSECTION 2のタブをタップすると、onTabReselectedがSECTION 2で呼び出されます。
SECTION 1からSECTION 2のタブをタップした場合、onTabUnselectedがSECTION 1で、onTabReselectedとonTabSelectedがSECTION 2で呼び出されます。ActionBar.Tab#select()でタブを切り替えた場合も同様です。
onTabReselectedは、タブがタップされたりActionBar.Tab#select()が呼び出されたりしたことが通知されますが、必ずしもタブが切り替わるわけではないことに注意してください。
今回のアプリでは、onTabSelectedのみ使用しています。
Copyright © ITmedia, Inc. All Rights Reserved.