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

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

[緒方聡,イーフロー]
前のページへ 1|2|3       

リストモードの操作

 今回のアプリはタブモードが主体で、リストモードへも切り替えられるようになっています。

 切り替えは以下のように行います。

if (mActionBar.getNavigationMode() == ActionBar.NAVIGATION_MODE_LIST) {
    mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
} else {
    mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
}

 ActionBarがリストモードならタブモードを、タブモードならリストモードを設定します。

 リストのアイテムも動的に変更することが可能ですが、今回はonCreate()で静的なリストを生成しています。

String[] listData = { "Item1", "Item2", "Item3", "Item4" };
ArrayAdapter<String> adapter =
    new ArrayAdapter<String>(getActionBarThemedContextCompat(),
    android.R.layout.simple_dropdown_item_1line, listData);
mActionBar.setListNavigationCallbacks(adapter, this);

 ArrayAdapterのインスタンスを生成するコンストラクタの第1引数に渡しているContextは、getActionBarThemedContextCompat()というメソッド経由で取得しています。これは以下のような実装になっており、Android 4.0以上ならActionBar#getThemedContext()が返すContextを、そうでなければActivityを使用するようにしています。

private Context getActionBarThemedContextCompat() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
        return getActionBar().getThemedContext();
    } else {
        return this;
    }
}

 この処理を怠ると、表示されるリストの見た目が以下のように変わります。

図6 怠ると右のようにリストがグレイになる

 このメソッドはイディオムなので、リストモードを使用する際に忘れずに利用してください。

 リスト生成コードを再掲します。

String[] listData = { "Item1", "Item2", "Item3", "Item4" };
ArrayAdapter<String> adapter =
    new ArrayAdapter<String>(getActionBarThemedContextCompat(),
    android.R.layout.simple_dropdown_item_1line, listData);
mActionBar.setListNavigationCallbacks(adapter, this);

 最後の行のActionBar#setListNavigationCallbacks()がリストモード時に表示されるリストとリストが選択された際のコールバックを設定するメソッドです。第2引数のActionBar.OnNavigationListenerは以下のメソッドを実装します。

public boolean onNavigationItemSelected(int itemPosition, long itemId) {
    return false;
}

 選択されたリストアイテムを処理した場合はtrueを、そうでない場合はfalseを返します。

カスタムビュー

 ActionBarにカスタムビューを設定し、見た目や操作をカスタマイズ可能です。

図7

 今回はアナログ時計とボタンを配置してみました。ボタンにはリスナーを設定することも可能です。

 カスタムビューは以下のように設定します。

int options = mActionBar.getDisplayOptions();
if ((options & ActionBar.DISPLAY_SHOW_CUSTOM) == ActionBar.DISPLAY_SHOW_CUSTOM) {
    mActionBar.setDisplayOptions(options ^ ActionBar.DISPLAY_SHOW_CUSTOM);
} else {
    mActionBar.setDisplayOptions(options | ActionBar.DISPLAY_SHOW_CUSTOM);
    if (mActionBar.getCustomView() == null) {
        mActionBar.setCustomView(R.layout.custom_view);
        ViewGroup group = (ViewGroup) mActionBar.getCustomView();
        group.findViewById(R.id.buttonOnCustomView).setOnClickListener(
                new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(MainActivity.this, "Hello!",
                    Toast.LENGTH_SHORT).show();
            }
        });
    }
}

 ActionBar#getDisplayOptions()で表示オプションを取得し、カスタムビューが設定されているかどうかをビットマスクで判定します。もし設定されていれば、ビットマスクでカスタムビューのビットを除去したオプションを設定することで、カスタムビューの解除が可能です。もしカスタムビューが設定されていなければ、ビットマスクでカスタムビューのビットを付与したオプションを設定します。

 ActionBar#getCustomView()でカスタムビューのインスタンスを取得し、インスタンスがnullなら唯一のインスタンスを生成し、ボタンにリスナーを設定します。

機能・独自性・統一感をよく検討して使おう

 2回にわたりActionBarについて解説しました。ActionBarにはいろいろと便利な機能が備わっており、特にタブによるFragmentの切り替えを用いてスマートなインターフェイスをユーザーに提供できるようになります。

 今回のアプリのように、タブモードとリストモードを切り替えたり、カスタムビューを使用したりすることで、独自の機能をActionBarに組み込めます。

 ただ、ActionBarはアプリを超えて横断的にユーザー体験を統一する目的もあり、前回の解説でも触れましたが、あまりにも独自過ぎる機能をActionBarに組み込んでしまうと、ユーザーが混乱してしまうことになるため、機能・独自性・統一感をよく検討して開発に望んでみてください。

「Androidで動く携帯Javaアプリ作成入門」バックナンバー
前のページへ 1|2|3       

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

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

メールマガジン登録

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