オプションメニュー
メニューの実装方法シリーズ第一弾は、オプションメニューです。
オプションメニュー (Options menu) は、アンドロイドの当初からある基本的なメニューです。
現在の画面の状況で、他にやれること(すなわちオプション(=選択肢))を表示します。
アンドロイドバージョン 2.3 以下では画面の下に表示。それ以降 (Android 3.x 以降) はアクションバーの中に含まれる形で提供されます。
オプションメニューの実装方法
ここで実装するプログラムは次の通りです。
アクションバー右側に、オプションメニューがあることを示すアイコンが表示され・・・
それをタップするとメニューが表示されます。
そしてメニュー項目を選ぶと、ログ (LogCat) に選択された項目が表示される・・・
というものです。
ちなみに、オプションメニューの特徴として、重要なメニューを可能な場合に自動的に外出しにできるという利点がありますので、それについてもあとで簡単に触れます。
実はオプションメニューは最近の ADT で Android Application Project を選んだ際に標準で実装されています。
しかしながら、表示するところまではできていても、メニューを選択したあとの部分が実装されていないので、その点を補足します。
メニューのリソースは次のようにします。(ここでは res/menu/main.xml として作成)
<menu
xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@+id/menu_settings"
android:showAsAction="never"
android:title="Settings"/>
<item
android:id="@+id/menu_help"
android:showAsAction="never"
android:title="Help"/>
</menu>
menu 要素の中に item が複数含まれ、そのひとつひとつがメニュー項目になります。また ID やラベル (android:title 属性) も設定できます。
前述のように、可能な場合に外出しにしたいメニューは android:showAsAction="ifRoom" とします。
コードは次のようになります。
package com.example.menutest1;
import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
public class MainActivity extends Activity {
static String TAG = "MenuTest1";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch(item.getItemId()){
case R.id.menu_settings:
Log.d(TAG, "Settings Selected.");
break;
case R.id.menu_help:
Log.d(TAG, "Help selected.");
break;
}
return true;
}
}
メニューを作成するところ (onCreateOptionsMenu) とメニューを選択したときの動作を定義するところ (onOptionsItemSelected) の二箇所がポイントです。
メニューの作成は onCreateOptionsMenu にてメニューインフレータを利用して、リソースから作成しています。
メニューを選択したときの onOptionsItemSelected メソッドには、選択したメニュー項目を表す MenuItem オブジェクトが渡されます。 この getItemId メソッドで識別子を取得できるので、それによって処理を振り分けることが可能です。