連載
» 2013年05月13日 18時00分 公開

ActionBarで、アプリのUIはこんなにスマートになるAndroidで動く携帯Javaアプリ作成入門(42)(2/3 ページ)

[緒方聡,イーフロー]

ActionBarの3つのモード

 タブモードの解説の前に、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.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。