android-support-v4を使ってみる (ActionBar編)
ioschedのソースコードを見たところ、以下のような条件式を使ってHoneyCombかそれ以前かを判定しています。
UIUtils.java
public static boolean isHoneycomb() { return Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB; }
このメソッドがtrueの場合は当然HoneyComb用のクラスを使うわけですが、falseの場合どうなるのかが今回の目の付け所。・・・と思ったんですが、結構ゴリゴリやってますな。超簡単に言うと、画面のテーマでタイトルバーを消し、最上部に通常のViewを配置しているだけでした。でも画面ごとにボタンなどの配置が変わります。この辺り、どうやって制御してるんでしょうか?
実はここが面白い構成になっています。
うまくオプションメニューとして指定されたメニューをActionBar上にボタンとして配置しているのです。
public void onPostCreate(Bundle bundle) { // MenuをActivityに生成してもらう Menu menu = new ActionBarMenu(_activity); _activity.onCreatePanelMenu(Window.FEATURE_OPTIONS_PANEL, menu); // ActionBarに追加する for(int i = 0; i < menu.size(); i ++) { MenuItem item = menu.getItem(i); addToActionBar(item); } } private void addToActionBar(final MenuItem item) { // この中でActionBarにMenuItemのアイコンを持つボタンを配置していく // もちろんクリックイベントリスナ内でActivityのonMenuItemSelected // をコールする }
ただし画面側はそんなこと露も知らずにオプションメニュー関連のメソッドをオーバーライドしています。
@Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_default, menu); return super.onCreateOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { boolean result = true; switch(item.getItemId()) { case R.id.menu_search: // インクリメンタルサーチ break; case R.id.menu_setup: // 設定画面に繊維 break; default: result = super.onOptionsItemSelected(item); break; } return result; }
結構ゴリゴリですが、なかなか思いつかないいい方法ですよね。
ioschedはスタイルの設定などが複雑なのですが、一つ一つ問題を解決しながら簡単な例を作成してみました。
ActionBar上にオプションメニューを置いてみた。
いっちょう前な見た目になりました。
ソースコードはこちらで公開しています。よかったらどーぞ。
→ actionbar_sample