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/