3

Androidデザイン ガイドでは、ヘルプは常にオーバーフロー メニューの最後の項目として配置する必要があり (ActionBar には表示されません)、ユーザーが探す必要がないように、すべてのアクティビティに存在する必要があると述べています。それ。設定についても同様のアプローチが推奨されます。

しかし、コードを何度も繰り返さずに、アプリ内のすべてのアクティビティがこれらの項目を確実に処理できるようにするには、どうすればよいでしょうか? これらの共通項目をすべての XML メニュー ファイルに手動で配置し、すべてのアクティビティ クラスでそれぞれの項目のクリックを手動で処理するのはナンセンスです。

私はすでに共通の基本クラス (いくつかの便利なメソッドを提供します) からすべてのアクティビティを拡張しているので、このアプローチを思い付きました:クラスでは、サブクラスがオーバーライドできるBaseActivity空のメソッド (テンプレート メソッド パターンスタイル)を定義します。特定のアイテムをメニューに追加します。このメソッドは の開始時に呼び出され、基本クラスは共通項目 (設定とヘルプ) をメニューの最後に追加します。initOptionsMenu()onCreateOptionsMenu()

このonOptionsItemSelected()メソッドは標準パターンに従います。アイテム ID をオンにし、デフォルトの場合はスーパークラスにハンドリングを渡します。繰り返しますが、基本クラスは設定とヘルプ ケースを処理します。

public class BaseActivity extends Activity {

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        initOptionsMenu(menu);
        menu.add(Menu.NONE, R.id.menu_settings, Menu.NONE, R.string.menu_help);
        menu.add(Menu.NONE, R.id.menu_help, Menu.NONE, R.string.menu_help);
        return true;
    }

    protected void initOptionsMenu(Menu menu) {}

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.menu_settings:
                startActivity(new Intent(this, SettingsActivity.class));
                return true;
            case R.id.menu_help:
                startActivity(new Intent(this, HelpActivity.class));
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }
}

これで、新しいアクティビティを作成するたびに、BaseActivity. 派生アクティビティがオプション メニューにさらにいくつかの項目を提供する場合、標準をオーバーライドしませんがonOptionsItemSelected()、代わりにカスタムの initOptionsMenu() メソッドをオーバーライドして、そこにメニューを設定します。ではonOptionsItemSelected()、このアクティビティに固有の項目のケースのみを処理する必要があります。一般的な項目はsuper呼び出しによって処理されます。

public class FooActivity extends BaseActivity {

    @Override
    protected void initOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.foo, menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            // cases for items in R.menu.foo

            default:
                return super.onOptionsItemSelected(item);
        }
    }
}

このパターンは賢明ですか?より良いアプローチを考え出すことはできますか? あなたの考えを共有してください。

4

1 に答える 1

3

initOptionsMenuメソッドを使用しない場合があります。super.onCreateOptionsMenu()具体的な実装からメニューを追加した後に呼び出すだけです。私BaseActivityは設定とヘルプメニューを追加しますBaseActivity

 @Override
public boolean onCreateOptionsMenu(Menu menu) {
    menu.add(Menu.NONE, R.id.menu_settings, Menu.NONE, R.string.menu_help);
    menu.add(Menu.NONE, R.id.menu_help, Menu.NONE, R.string.menu_help);
    return true;
}

そしてMainActivityextendsでBaseActivity

 @Override
public boolean onCreateOptionsMenu(Menu menu) {
    menu.add(Menu.NONE, R.id.menu_create_dummy, Menu.NONE, R.string.menu_dummy);
    menu.add(Menu.NONE, R.id.menu_delete_dummy, Menu.NONE, R.string.menu_dummy);
    return super.onCreateOptionMenu(menu);
}
于 2013-02-17T14:57:42.337 に答える