ASとか

開発系の記事が多めです。タイトルのASはActionScriptの略です。

MENU作成方法

基本

  • 新規Android XMLファイル作成
    • タイプを"メニュー"に設定
  • 作成したXMLにItemを追加してTitleやIconを設定する
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生成&選択イベントは別クラスへ

  • とりあえずXMLの作り方を変更
    • 一つのメニュー用XMLにアプリで使用する全てのItemを設定しておく
    • 全画面で表示されるItem以外のVisibleを全てfalseにしておく
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クラスにどんどん共通処理をまとめればいいと思うよ。