选项多个活动通用的菜单项

时间:2013-02-17 14:41:13

标签: android android-optionsmenu

Android design guide表示应始终将帮助放在溢出菜单的最后一项(它应该永远不会出现在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);
        }
    }
}

这种模式是否明智?你能想出更好的方法吗?请分享您的想法。

1 个答案:

答案 0 :(得分:2)

我可能不会使用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;
}

并在MainActivity扩展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);
}