Android の Menu キーを押した時の Menu の作成、表示方法にはいくつか方法があります。とりあえず静的(内容の変更がない)な場合はあらかじめ XML ファイルに内容を記述して呼び出す形がシンプルで管理もしやすいと思います。
公式サイトでは以下が参考になります。
User Interface > Menus
今回は以下のようなものを用意してみました。Eclipse の “Package Explorer” を右クリックして New -> Android XML File を選択します。 “New Android XML File” ダイアログの “Resource Type” から Menu を選択して “Project” にこの XML ファイルを追加するプロジェクトを選択します。 “File” にはこの XML ファイルの名前を適当に入力します。
最低限、以下のように設定しておけば表示と項目選択時の動作をさせることが出来ます。項目自体の ID は “@+id/toggle_culling” などとして保存することで、 “R.java” ファイルに自動的に ID が追加されます。この ID は後で項目選択時の動作を書く時に使います。メニューボタンに表示させる文字列は “string.xml” に文字列を記入しておき、そこに登録した ID で文字列を引くようにしています。
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/toggle_culling" android:title="@string/toggle_culling" /> <item android:id="@+id/toggle_transparent" android:title="@string/toggle_transparent" /> <item android:id="@+id/toggle_texture" android:title="@string/toggle_texture" /> <item android:id="@+id/select_bg_color" android:title="@string/select_bg_color" /> </menu> |
“string.xml” の例は以下のようになります。
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="toggle_culling">カリング</string> <string name="toggle_transparent">透明</string> <string name="toggle_texture">テクスチャ</string> <string name="select_bg_color">背景色</string> </resources> |
メニューボタンが押された時は Activity::onCreateOptionsMenu() が呼び出されるので、これをオーバーライドして MenuInflater::inflate() に先ほど作ったメニューの ID を指定します。
メニューの項目が選択された場合は Activity::onOptionsItemSelected() が呼び出されるので、これもオーバーライドして選択された時の動作を記述します。どれが選択されたかは MenuItem::getItemId() を使って判定をします。この ID は先ほどメニューの XML で “@+id/toggle_culling” などとした ID を使うことが出来ます。Eclipse の補完候補に出てこない場合は XML ファイルの保存を忘れているか、記述ミスがあると思うのでコンソールを確認してみて下さい。
public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.main_menu, menu); return true; } public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.toggle_culling: m_renderer.toggleCulling(); return true; case R.id.toggle_texture: m_renderer.toggleTexture(); return true; case R.id.toggle_transparent: m_renderer.toggleTransparent(); return true; case R.id.select_bg_color: m_colorPickerDialog.show(); return true; default: return super.onOptionsItemSelected(item); } } |
これらの実行例を以下に示します。これらは直接プログラムに書くことも出来るのですが、XML ファイルなどでプログラムの外に出した方がメンテナンスもやりやすいですし、多言語化にも対応しやすいのでオススメです。
それにしても、Android アプリケーションの開発は Eclipse のプラグインがないとやりにくいですね。私は Emacs 使いなのであまり開発環境は使わないのですが、Android アプリの場合は補完の関係もあり Eclipse 内でプログラミングをすることも時々あります。