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