オプションのつくりかた
onCreateOptionsMenuの引数Menu#add()によりオプションを追加できます。
@Override public boolean onCreateOptionsMenu(Menu menu) { menu.add(Menu.NONE, OPTION_ITEM_ADD, Menu.NONE, "add") .setIcon(android.R.drawable.ic_menu_add); menu.add(Menu.NONE, OPTION_ITEM_EDIT, Menu.NONE, "edit") .setIcon(android.R.drawable.ic_menu_edit); return true; }
onCreateOptionsMenuは、アプリケーションで最初にmenuキーが押されたときだけ呼ばれる。
オプションが選択されたときのハンドリングはonOptionsItemSelectedで行う。
@Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case OPTION_ITEM_ADD: Toast.makeText(this, "add", Toast.LENGTH_SHORT).show(); break; case OPTION_ITEM_EDIT: Toast.makeText(this, "edit", Toast.LENGTH_SHORT).show(); default: break; } return true; }
Intentにより動的にオプションを追加する
Menu#addIntentOptions()のパラメータにIntentを渡すことにより、そのIntentに合致するアプリをItemとして動的に追加できます。
addIntentOptionsは指定したgroupIdのアイテムを上書きしてしまうので、専用のGroupIdをMenu.CATEGORY_ALTERNATIVEで指定しておくのが作法のようです。
@Override public boolean onCreateOptionsMenu(Menu menu) { menu.add(Menu.NONE, OPTION_ITEM_ADD, Menu.NONE, "add").setIcon(android.R.drawable.ic_menu_add); menu.add(Menu.NONE, OPTION_ITEM_EDIT, Menu.NONE, "edit").setIcon(android.R.drawable.ic_menu_edit); Intent intent = new Intent(); intent.setAction(Intent.ACTION_VIEW); intent.addCategory(Intent.CATEGORY_ALTERNATIVE); intent.setType("vnd.android.cursor.dir/vnd.kaw0909-optionsample.hoge"); int intentOptions = menu.addIntentOptions(Menu.CATEGORY_ALTERNATIVE, Menu.NONE, Menu.NONE, this.getComponentName(), null, intent, 0, null); Log.v("EXAMPLE", "intentOptions:" + intentOptions); return true; }
IntentOptionsで追加されるアプリケーションのintent-filter
<intent-filter android:label="sample"> <action android:name="android.intent.action.VIEW"></action> <category android:name="android.intent.category.ALTERNATIVE"></category> <data android:mimeType="vnd.android.cursor.dir/vnd.kaw0909-optionsample.hoge"></data> </intent-filter>
OptionItemのtitleは、intent-filterのandroid:labelになります。省略するとアプリ名。