android - 多个 Activity 通用的选项菜单项

标签 android android-optionsmenu

Android design guide说 Help 应该总是放在溢出菜单的最后一项(它永远不应该出现在 ActionBar 中),而且它应该出现在每个 Activity 中,这样用户就不必寻找它。设置也推荐使用类似的方法。

但是,我想知道什么是确保我的应用程序中的所有 Activity 处理这些项目而无需大量代码重复的最佳方法?将这些常用项目手动放入每个 XML 菜单文件,然后在每个 Activity 类中手动处理对每个项目的点击,这简直是无稽之谈。

因为我已经从一个公共(public)基类(它提供了一些方便的方法)扩展了我的所有 Activity ,所以我想到了这种方法:在 BaseActivity 类中,我定义了一个空的 initOptionsMenu() 方法,子类可以通过将它们的特定项目添加到菜单来覆盖(模板方法模式 样式)。此方法在 onCreateOptionsMenu() 开始时调用,然后基类在菜单末尾添加常用项目(设置和帮助)。

onOptionsItemSelected() 方法遵循标准模式 - 它打开项目 ID,在默认情况下,它将处理传递给父类(super class)。同样,基类处理设置和帮助案例。

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);
        }
    }
}

现在,每当我创建一个新 Activity 时,我都会扩展 BaseActivity。如果派生 Activity 为选项菜单提供更多项目,我不会覆盖标准 onOptionsItemSelected(),而是覆盖自定义 initOptionsMenu() 方法并在此处填充菜单。在 onOptionsItemSelected() 中,我只需要处理此 Activity 特定项目的情况,常见的情况将由 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);
        }
    }
}

这个模式合理吗?你能想出更好的方法吗?请分享您的想法。

最佳答案

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

关于android - 多个 Activity 通用的选项菜单项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14922228/

相关文章:

java - 无法使用 smack-Android 在 openfire 中创建新用户

android - 选择要在启动时加载的 Activity - Android

android - Robotium中@Smoke的意义是什么?应该什么时候使用?

android - 窗口管理器的透明 View 覆盖 "falls off"?

android - 单击工具栏上的汉堡包图标不会打开抽屉导航

android - 在 dispatchCreateOptionsMenu 期间旋转出现 NullPointerException,堆栈跟踪不包含我的应用程序中的任何函数

Android - 有可能在菜单方法之外获取菜单 View 吗?

android - 如何在android的菜单项中添加切换按钮

android - onPrepareOptionsMenu 未被调用

java - Android中如何同时触摸两个按钮