OptionMenuについて(1)
多くのAndroid端末には戻るボタン、ホームボタン、メニューボタンがあります。
操作に困った時、またはほかの機能がないかと探す時にメニューボタンを
1度は押したことがあるかとおもいます。
大体のソフトで、よく使うであろう処理をメニューに実装することが多いです。
そのメニューボタンを押下した際の実装方法について勉強していきます。
メニューボタンを押すと追加、編集、削除、保存、ヘルプ、その他、の
メニューを表示するようにします。
設定メニュー(OptionsMenu)は最大6つまで同時に表示できます。
それ以上は「その他」ボタンで統合され、List形式で表示されます。
プロジェクト作成
プロジェクト名:OptionMenusTest、アクテビティ名:MainActivity、レイアウト名:main、で作成します。(Strings.xml)編集
次にアプリで使用する文字列を定義します。(定義方法はStrings.xmlについての勉強を参照)
・追加(action_add)
・編集(action_edit)
・削除(action_delete)
・保存(action_save)
・ヘルプ(action_help)
・その他(action_else)
MainActivity.java編集
ActivityクラスのonCreateOptionsMenuメソッドをオーバーライドします。大体はプロジェクト作成時に、自動でメソッドが追加されているはずです。
public class MainActivity extends Activity {
public static final int MENU_SELECT_ADD = 0;
public static final int MENU_SELECT_EDIT = 1;
public static final int MENU_SELECT_DELETE = 2;
public static final int MENU_SELECT_SAVE = 3;
public static final int MENU_SELECT_HELP = 4;
public static final int MENU_SELECT_ELSE = 5;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
//getMenuInflater().inflate(R.menu.main, menu);
menu.add(0,MENU_SELECT_ADD,1,getString(R.string.action_add));
menu.add(0,MENU_SELECT_EDIT,2,getString(R.string.action_edit));
menu.add(0,MENU_SELECT_DELETE,3,getString(R.string.action_delte));
menu.add(0,MENU_SELECT_SAVE,4,getString(R.string.action_save));
menu.add(0,MENU_SELECT_HELP,5,getString(R.string.action_help));
menu.add(0,MENU_SELECT_ELSE,6,getString(R.string.action_else));
return true;
}
onCreateOptionsMenuメソッド内で
menu.add(int groupId, int itemId, int order, CharSequence title)のメソッドを呼ぶことで、1個のメニューを追加します。
onCreateOptionsMenuの引数としてMenuクラスが渡ってきます。
このMenuクラスのaddメソッドでMenuItemクラスを追加することで端末のメニューボタンを押したときにメニューが表示されるようになります。
引数の意味は下記のとおりです。
groupId:グループID
グループの識別子。メニューをグループ分けする必要がない時は通常NONEを指定する。
itemID:アイテムID
メニューアイテムが選択された時に識別するためのIDを指定する。ユニークなIDが不要な場合はNONEを指定する。
order:メニュー内での表示順
メニューアイテムの表示する順番。NONEを指定すれば、追加した順番で表示される。
title:メニュー名
メニューに表示する文字列
次にonOptionsItemSelectedメソッドをオーバーライドします。
引数には選択されたMenuItemクラスが渡ってきます。
getItemIdメソッドでMenuクラスのaddメソッドで追加した時に指定したユニークIDが得られるのでswitch文などでメニューアイテムごとに処理を記述します。
/*
* メニュー押下時
*/
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// TODO 自動生成されたメソッド・スタブ
switch (item.getItemId()) {
case MENU_SELECT_ADD:
Toast.makeText(this, getString(R.string.action_add), Toast.LENGTH_LONG).show();
break;
case MENU_SELECT_EDIT:
Toast.makeText(this, getString(R.string.action_edit), Toast.LENGTH_LONG).show();
break;
case MENU_SELECT_DELETE:
Toast.makeText(this, getString(R.string.action_delte), Toast.LENGTH_LONG).show();
break;
case MENU_SELECT_SAVE:
Toast.makeText(this, getString(R.string.action_save), Toast.LENGTH_LONG).show();
break;
case MENU_SELECT_HELP:
Toast.makeText(this, getString(R.string.action_help), Toast.LENGTH_LONG).show();
break;
case MENU_SELECT_ELSE:
Toast.makeText(this, getString(R.string.action_else), Toast.LENGTH_LONG).show();
break;
default:
break;
}
return super.onOptionsItemSelected(item);
}
あとは、デバッグしてみてください、メニューボタンを押下すると、下図のように、メニューが表示されるはずです。
カテゴリーへ
OptionMenuについて(2) Action Bar編
OptionMenuについて(1)の続きで、アイコンを設定して表示しようと思ったのですが 公式 参考サイト
なかなかアイコンが表示されなくてかなりはまりこんでしまいました。
色々調べた結果、Android 3.0以降ではメニューボタンの概念が大きくかわっているとのこと。なんてこった!
Android 3.Xや4.0の端末にはオプションメニューを表示するためのハードキーがない物が多いらしく、
代わりにAction Barというメニュー用の新しいコンポーネントを画面上に表示させることが推奨されているらしい。
で、OptionMenuについて(1)で作成したアプリの最小必須SDKを、API8にしていたため、うまく動かなかったみたいで、
何回setIconでアイコン設定しても表示されなくて泣きそうになってました。
ということで今回はAction Barについて勉強していきます。
最小必須SDK設定
プロジェクトにつては、OptionMenuについて(1)で作成したプロジェクトを使いまわしていきます。Action Barは、Android 3.0(API Level 11)以上で使用可能な機能のため、 まずは最小必須SDKが何になっているかを確認して、(API Level 11)以上になるようにします。
確認方法はAndroidManifest.xmlのminSdkVersion項目で確認できます。
<uses-sdk
android:minSdkVersion="11"
android:targetSdkVersion="17" />
MainActivity.java編集(アイコン設定)
次はメニューにアイコンを設定したいと思います。表示させるアイコンは自作画像、Androidが標準で持っているアイコンの画像どちらも使用できます。
今回は標準アイコンを使用します。
追加:ic_menu_add
編集:ic_menu_edit
削除:ic_menu_delete
保存:ic_menu_save
ヘルプ:ic_menu_help
その他:ic_menu_info_details
各メニューに対してのアイコン設定は
onCreateOptionsMenuメソッド内で設定します。
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
//getMenuInflater().inflate(R.menu.main, menu);
MenuItem target = menu.add(0,MENU_SELECT_ADD,0,getString(R.string.action_add));
target.setIcon(android.R.drawable.ic_menu_add);
target = menu.add(0,MENU_SELECT_EDIT,0,getString(R.string.action_edit));
target.setIcon(android.R.drawable.ic_menu_edit);
target = menu.add(0,MENU_SELECT_DELETE,3,getString(R.string.action_delte));
target.setIcon(android.R.drawable.ic_menu_delete);
target = menu.add(0,MENU_SELECT_SAVE,4,getString(R.string.action_save));
target.setIcon(android.R.drawable.ic_menu_save);
target = menu.add(0,MENU_SELECT_HELP,5,getString(R.string.action_help));
target.setIcon(android.R.drawable.ic_menu_help);
target = menu.add(0,MENU_SELECT_ELSE,6,getString(R.string.action_else));
target.setIcon(android.R.drawable.ic_menu_info_details);
return super.onCreateOptionsMenu(menu);
}
MainActivity.java編集(アクションバーアイテム設定)
つぎは表示モードを設定していきますMenuItem#setShowAsActionメソッドで、ActionBar上での表示モードを設定しています。Honeycombでは以下の4つの項目があります。
MenuItem.SHOW_AS_ACTION_ALWAYS
常にActionBar上に表示されます。
常に表示されるメニューは2つ以下が望ましいらしいです。
MenuItem.SHOW_AS_ACTION_IF_ROOM
ActionBar上にアイコンを配置する隙間があれば、表示します
MenuItem.SHOW_AS_ACTION_NEVER
ActionBar上に表示しません。
MenuItem.SHOW_AS_ACTION_WITH_TEXT
アイコンとテキストラベルを一緒に表示します
今回はSHOW_AS_ACTION_IF_ROOMをつかってみます
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
//getMenuInflater().inflate(R.menu.main, menu);
MenuItem target = menu.add(0,MENU_SELECT_ADD,0,getString(R.string.action_add));
target.setIcon(android.R.drawable.ic_menu_add);
target.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM );
target = menu.add(0,MENU_SELECT_EDIT,0,getString(R.string.action_edit));
target.setIcon(android.R.drawable.ic_menu_edit);
// SHOW_AS_ACTION_ALWAYS:常に表示
target.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM );
target = menu.add(0,MENU_SELECT_DELETE,3,getString(R.string.action_delte));
target.setIcon(android.R.drawable.ic_menu_delete);
// SHOW_AS_ACTION_ALWAYS:常に表示
target.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM );
target = menu.add(0,MENU_SELECT_SAVE,4,getString(R.string.action_save));
target.setIcon(android.R.drawable.ic_menu_save);
// SHOW_AS_ACTION_ALWAYS:常に表示
target.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM );
target = menu.add(0,MENU_SELECT_HELP,5,getString(R.string.action_help));
target.setIcon(android.R.drawable.ic_menu_help);
// SHOW_AS_ACTION_ALWAYS:常に表示
target.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM );
target = menu.add(0,MENU_SELECT_ELSE,6,getString(R.string.action_else));
target.setIcon(android.R.drawable.ic_menu_info_details);
// SHOW_AS_ACTION_ALWAYS:常に表示
target.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM );
return super.onCreateOptionsMenu(menu);
}
あとは、デバッグしてみてください、メニューボタンを押下すると、下図のように、メニューが表示されるはずです。
カテゴリーへ