Android设计指南说,Help 应该始终放在溢出菜单的最后一项(它不应该出现在 ActionBar 中),并且应该出现在每个 Activity 中,这样用户就不必寻找它。类似的方法也被推荐用于设置。
但是,我想知道确保我的应用程序中的所有活动都处理这些项目而没有大量代码重复的最佳方法是什么?将这些常用项手动放入每个 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);
}
}
}
这种模式合理吗?你能想出更好的方法吗?请分享你的想法。