オプションメニューは、メニューボタンを押すと大体のアプリで画面下部に出てくるボタンです。
次にコンテキストメニュー。Androidのスマートフォン初心者の私はまず「コンテキストメニュー?PCのあれっぽいやつ?そんなのあったの?」って思いました。特定のビューを長めにタップすればいいんだそうです。ちょっとスマフォレベルが上がりました。
最後にサブメニュー。まあ、メニューの入れ子状態です。親・子の2世代まで可能っぽい。
一番右側の画像の状態。これはオプションメニューの親メニューを押しています。
メニューを作成するには、XMLファイルで定義してそれを読み込ませるか、コード内でガリガリ書くのどちらかになります。
XMLファイル
まあこんな感じです。ファイルはres/xmlディレクトリに配置します(ディレクトリが無ければ作りましょう)。
これはオプションメニューのXMLファイルです。コンテキストメニューも同じように作ればおk。
checkableBehaviorを使うとチェック可能なUIにしてくれます。
コンテキストメニューの場合はステートレスなので、自分で状態管理が必要になります。
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/user" android:icon="@drawable/user" android:title="@string/user" /> <item android:id="@+id/group" android:icon="@drawable/group" android:title="@string/group" /> <item android:id="@+id/parent2" android:title="親メニュー"> <menu> <group android:checkableBehavior="single"> <item android:id="@+id/red" android:title="赤" /> <item android:id="@+id/blue" android:title="青" /> </group> </menu> </item> <item android:id="@+id/mob1" android:title="モブ" /> <item android:id="@+id/mob2" android:title="モブ" /> <item android:id="@+id/mob3" android:title="モブ" /> <item android:id="@+id/mob4" android:title="モブ" /> <item android:id="@+id/mob5" android:title="モブ" /> </menu>
Javaコード
public class MenuSampleActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setContentView(R.layout.menu_sample);
// ボタンにコンテキストメニューを登録。
// これで長めタップでコンテキストメニューを出せるようになる。
Button button1 = (Button) this.findViewById(R.id.button1);
registerForContextMenu(button1);
}
// オプションメニュー生成
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = this.getMenuInflater();
inflater.inflate(R.menu.option_menu , menu);
return true;
}
// オプションメニュー選択時の処理振り分け
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch(item.getItemId()) {
case R.id.user:
debug("selected user menu");
return true;
case R.id.group:
debug("selected group menu");
return true;
case R.id.red:
case R.id.blue:
item.setChecked(!item.isChecked());
return true;
default:
return super.onOptionsItemSelected(item);
}
}
// コンテキストメニュー生成
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
MenuInflater inflater = getMenuInflater();
switch(v.getId()) {
case R.id.button1:
inflater.inflate(R.menu.context_menu, menu);
break;
}
}
// コンテキストメニュー選択時の処理振り分け
@Override
public boolean onContextItemSelected(MenuItem item) {
debug("call onContextItemSelected");
switch (item.getItemId()) {
case R.id.edit:
return true;
case R.id.delete:
return true;
default:
return super.onContextItemSelected(item);
}
}
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
// Android2.3まではオプションメニューを開く度に、ここの処理が呼び出される。
// Android3.0からはinvalidateOptionsMenuを明示的に呼ばないと、ここの処理は呼ばれない。
debug("call onPrepareOptionsMenu");
return super.onPrepareOptionsMenu(menu);
}
private void debug(String msg) {
Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
}
}
ノシ



