連載
» 2013年04月11日 18時00分 公開

Androidで動く携帯Javaアプリ作成入門(41):Android 4.x時代のアプリにないと残念なActionBarとは (3/3)

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

アプリケーションアイコンに機能を追加する

 ActionBarにはアプリケーションのブランディングの意味も含め、アプリケーションアイコンが表示されています。このアイコンにナビゲーション機能を持たせることができます。

図9 ナビゲーション機能を追加

 まずは、アプリアイコンにホームボタン機能を追加する方法です。以下のように「ActionBar#setHomeButtonEnabled(boolean)」メソッドにtrueを渡すことで、アプリアイコンがタップできるようになります。

getActionBar().setHomeButtonEnabled(true);

 アプリアイコンがタップされた場合、Activity#onMenuItemSelected(int, MenuItem)にメニューIDがandroid.R.id.homeのイベントが通知されます。これをハンドリングして、アプリのホーム画面に遷移するように実装します。場合によっては、アプリアイコンがタップされた際に、アプリのホーム画面に遷移するのではなく、他の機能を動作させたくなるかもしれません。

 ただ、グーグル作成のプリインストールアプリを含む多くのアプリで、ここはナビゲーション機能に割り当てられているため、不用意に他の機能を割り当ててユーザーの混乱を招くのは得策ではありません。ActionBarの「統一されたインターフェイス」という理念にも則しません。

 次に、アプリアイコンに戻る機能を追加する方法です。以下のようにActionBar#setHomeAsUpEnabled(boolean)メソッドにtrueを渡すことで、機能を実現できます。

getActionBar().setDisplayHomeAsUpEnabled(true);

 アプリアイコンがタップされた場合、setHomeButtonEnabled ()と同様Activity#onMenuItemSelected(int, MenuItem)にメニューIDがandroid.R.id.homeのイベントが通知されます。これをハンドリングして、上の階層に戻る機能を実装します。

 バックキーとアップナビゲーションの違いは、バックキーが直前のActivityに戻るのに対し、アップナビゲーションはそのアプリのそのActivityの呼び出し元に相当するActivityに遷移するところです。

 例えば、WebブラウザからPlayストアを起動した場合、バックキーならブラウザに戻り、アップナビゲーションならPlayストア内の上位画面に遷移します。このような動作で統一されたインターフェイスをユーザーに提供しようとしているため、独自の処理を行うよりも上位画面へ遷移するように実装してください。

 本サンプルでは、設定画面→プレビュー画面→編集画面というふうに遷移するように実装してあります。

 アイコンにナビゲーション機能を持たせた場合は、図9のような見た目の変化が現れますが、ホームボタン機能の場合は見た目に変化が現れません。ユーザーにアイコンがタップできることを知らせるという意味で、ホームボタン機能ではなくナビゲーション機能を使用することをお勧めします。

 注意してほしいのは、「setHomeAsUpEnabled(true)」が呼び出されたら、「setHomeButtonEnabled(boolean)」もtrueで設定される点です。これは「setHomeAsUpEnabled(false)」で解除しても、引き続き「setHomeButtonEnabled(boolean)」は有効なままなので、アプリアイコンがタップできてしまい、つまりイベントが通知されてしまいます。「setHomeAsUpEnabled(false)」を行った際に「setHomeButtonEnabled(false)」も忘れずに行うようにしてください。

ActionBarにSearchViewを追加

 ActionBarに検索用のSearchViewを表示できます。Webブラウザでページ内を検索、というような用途に使用します。今回のサンプルアプリでは、表示するところまでで実際の検索機能は実装してありません。

 表示するにはXMLで定義する方法とJavaで動的に行う方法があります。設定の方法は全く同じではないのですがプログレスバーのそれと似ているため、今回のアプリでは動的に行う方法を解説します。

 SearchViewをActionBarに展開するためのMenuItemを追加・削除するメソッドは、以下のように1つのメソッドとして実装しています。

private void toggleSearchView() {
    int id = R.id.toggleButtonSearchViewUsed;
    if (mMenu.findItem(id) == null) {
        mMenu.add(Menu.NONE, id, Menu.NONE, R.string.action_search)
            .setIcon(android.R.drawable.ic_menu_search)
            .setActionView(new SearchView(this))
            .setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS |
                MenuItem.SHOW_AS_ACTION_WITH_TEXT |
                MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW);
    } else {
        mMenu.removeItem(id);
    }
}

 追加するMenuItemのidは、ユニークになるものを使用します。2行目では、トグルボタンのIDを使用しています。3行目では、メニューに存在しなければ追加し、存在すれば削除するように実装しています。4行目では、メニューに、IDとテキストを指定してMenuItemを追加します。

 5行目以降、メソッドチェーンで連続して設定を行います。ここではアイコンを設定しています。6行目では、アクションビューを設定します。7行目では、最後にアクションアイテムの振る舞いを設定します。

 ログレスバーの場合もそうなのですが、検索ボックスが表示されている状態でActionBarの状態をさらに変更するような操作は行えないようにしてください。以下は、検索ボックスが表示されている状態でSAVEアイコンをタップして、プログレスバーを出した後の表示です。

図10 表示が重なってしまった

 本サンプルのようにActionBarに表示されているアクションアイテムを頻繁に変更したり、複数のビューを切り替えて表示させたりするようなアプリは、実際にはあまりないかもしれませんが、注意すべき点です。

次回は、さらにActionBarの機能を追究

 今回はActionBarの基本、ActionBarをメニュー代わりに使用する方法、プログレスバーを追加する方法、動的に表示・非表示を切り替える方法、ナビゲーション機能を追加する方法を解説しました。

 ActionBarには、この他にも、タブ、ドロップダウンメニュー、独自レイアウトを表示する機能などがあります。今回説明しきれなかった細かい配慮なども含め、次回は、さらにActionBarの機能を追究して紹介する予定です。

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

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

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

メールマガジン登録

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