MENU作成方法
基本
Activity側
// Menu表示イベント @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); try { // XMLリソースを元にMenu作成 inflater.inflate(R.menu.menus, menu); } catch (InflateException e) { return false; } return true; } // Menu選択イベント @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.item1: // 画面遷移とか return true; default: return super.onOptionsItemSelected(item); } }
使いやすくする
- 面倒な点
- 毎回MenuInflater作成
- 少しMenuが違うだけでXML新規作成
- Menu選択処理を各Activityに記述
Menu生成&選択イベントは別クラスへ
Menu生成&選択処理をまとめたクラス(MenuManager.java)
public static boolean createOptionsMenu(Activity activity, Menu menu, int ...items) { // 呼び出し側ActivityへMenu設定 MenuInflater inflater = activity.getMenuInflater(); try { inflater.inflate(R.menu.menus, menu); } catch (InflateException e) { return false; } // 指定されたitemのみ表示 for (int i = 0; i < items.length; i++) { MenuItem item = menu.findItem(items[i]); if (null != item) item.setVisible(true); } return true; } public static boolean optionsItemSelected(Activity activity, MenuItem item) { switch (item.getItemId()) { case R.id.item1: // item1の基本イベント return true; case R.id.item2: // item2の基本イベント return true; default: return false; } }
Activity側
// Menu表示イベント @Override public boolean onCreateOptionsMenu(Menu menu) { // 第三引数には表示したいアイテムのみ設定 return MenuManager.createOptionsMenu(this, menu, R.id.item1, R.id.item2); } // Menu選択イベント @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { // MenuManagerの共通処理とは別の処理がしたい場合にcaseを追加 case R.id.item1: // 独自設定 return true; default: // 共通処理 return MenuManager.optionsItemSelected(this, item); } }
これで
処理が散らばらなくなったと思います。あとはMenuでやりたいことによってMenuManagerクラスにどんどん共通処理をまとめればいいと思うよ。