今回のアプリはタブモードが主体で、リストモードへも切り替えられるようになっています。
切り替えは以下のように行います。
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; } }
この処理を怠ると、表示されるリストの見た目が以下のように変わります。
このメソッドはイディオムなので、リストモードを使用する際に忘れずに利用してください。
リスト生成コードを再掲します。
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にカスタムビューを設定し、見た目や操作をカスタマイズ可能です。
今回はアナログ時計とボタンを配置してみました。ボタンにはリスナーを設定することも可能です。
カスタムビューは以下のように設定します。
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に組み込んでしまうと、ユーザーが混乱してしまうことになるため、機能・独自性・統一感をよく検討して開発に望んでみてください。
Copyright © ITmedia, Inc. All Rights Reserved.