SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Android Studio 2で始めるアプリ開発入門

Androidアプリのメニュー ~ オプションメニューとコンテキストメニュー

Android Studio 2で始めるアプリ開発入門 第8回


  • X ポスト
  • このエントリーをはてなブックマークに追加

コンテキストメニュー

 さて、もうひとつのメニューであるコンテキストメニューを紹介します。

コンテキストメニューの作り方

 コンテキストメニューはリストビューなどを長押ししたときに下図のように表示されるメニューです。

図7 コンテキストメニューが追加されたリスト画面
図7 コンテキストメニューが追加されたリスト画面

 といっても、作り方はオプションメニューと変わりません。menuフォルダにxmlファイルを作成し、アクティビティにonCreateContextMenu()メソッドを追加します。

 今回は、menu_context_menu_list.xmlという名称でxmlファイルを追加します。xmlファイルの記述方法はオプションメニューと同じですので、ダウンロードサンプルの

res/menu/menu_context_menu_list.xml

 を参照してください。ただし、showAsAction属性は使えませんので、注意してください。

 onCreateContextMenu()メソッドに関しては、以下のソースコードを記述してください。

リスト7 MenuListActivityにonCreateContextMenu()メソッドを追加
@Override
public void onCreateContextMenu(ContextMenu menu, View view, ContextMenu.ContextMenuInfo menuInfo) {
	super.onCreateContextMenu(menu, view, menuInfo);  //(1)
	MenuInflater inflater = getMenuInflater();  //(2)
	inflater.inflate(R.menu.menu_context_menu_list, menu);  //(3)
	menu.setHeaderTitle(R.string.menu_list_context_header);  //(4)
	menu.setHeaderIcon(android.R.drawable.ic_menu_info_details);  //(5)
}

 リスト7の(1)~(3)は定型処理です。

 コンテキストメニューにヘッダータイトル文字列を指定する場合は、setHeaderTitle()メソッドを使います(リスト7の(4))。また、アイコンを指定する場合は、setHeaderIcon()メソッドを使います(リスト7の(5))。

 最後に、onCreate()メソッド内末尾に以下の1行を追記してください。

registerForContextMenu(_lvMenu);

 これは、コンテキストメニューを表示する画面部品を登録するメソッドです。この1行でListViewにコンテキストメニュー表示が登録されます。

コンテキストメニュー選択時の処理

 コンテキストメニュー選択時の処理は、onContextItemSelected()メソッドに記述します。MenuListActivityに以下のメソッドを追加してください。

リスト8 MenuListActivityにonContextItemSelected()メソッドを追加
@Override
public boolean onContextItemSelected(MenuItem item) {
    AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();  //(1)
    int listPosition = info.position;  //(2)
    Map<String, String> menu = _menuList.get(listPosition);  //(3)

    int itemId = item.getItemId();
    switch(itemId) {  //(4)
        case R.id.menuListContextDesc:  //(5)
            String desc = menu.get("desc");
            Toast.makeText(MenuListActivity.this, desc, Toast.LENGTH_LONG).show();
            break;
        case R.id.menuListContextOrder:  //(6)
            // ここに注文処理を記述。
            break;
    }
    return super.onContextItemSelected(item);
}

 基本の記述方法はonOptionsItemSelected()と変わりません。ただ、コンテキストメニューの場合は、リストビューのどの行をタップしたかの情報を取得する必要があります。それがリスト8の(1)と(2)です。これは、引数であるitemのgetMenuInfo()メソッドの戻り値をAdapterView.AdapterContextMenuInfo型にキャストすることで可能です。AdapterContextMenuInfoオブジェクトには、そのフィールドpositionにリストビューのどの行をタップしたかの値が格納されています。これを取り出しているのがリスト8の(2)であり、その値を使って、_menuListからメニュー情報のMapオブジェクトを取得しているのがリスト8の(3)です。

 あとは、タップされた選択肢のR値に応じて、処理を分岐しています(リスト8の(4))。

 リスト8の(5)ではメニューの説明がトーストで表示されるようにしています。

 リスト8の(6)は注文処理になりますので、ListItemClickListenerクラスのonItemClick()メソッドと同じ内容となります。ただ、そうなると、ソースコードが重複してしまいます。そこで、ダウンロードサンプルでは、これをprivateメソッドorder()として、これを実行する形式になっています。

まとめ

 今回は、Androidのメニューであるオプションメニューとコンテキストメニューを解説しました。

 次回は、フラグメントを紹介します。

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
Android Studio 2で始めるアプリ開発入門連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト 齊藤 新三(サイトウ シンゾウ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook <個人紹介>WINGSプロジェクト所属のテクニカルライター。Web系製作会社のシステム部門、SI会社を経てフリーランスとして独立。屋号はSarva(サルヴァ)。HAL大阪の非常勤講師を兼務。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/9565 2018/05/23 15:36

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング