我修改了CommonsWare的prefenceActivity应用程序,但遇到了问题。
我想使用菜单按钮启动prefenceActivity,然后使用后退按钮完成它。
我已经通过菜单按钮启动了prefenceActivity:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
startActivity(new Intent(this, EditPreferences.class));
return(true);
}
它确实会回到我对该应用程序的主视图,但我认为它还没有完成,因为当我再次按下菜单按钮时,prefenceActivity不会弹出agian。我必须关闭我的应用程序,而不是只能再使用一次。
当我按下后退按钮时,我已经尝试在我的prefenceActivity中完成它,但这也无济于事。
我做错了什么?
感谢您的帮助!
答案 0 :(得分:14)
如果您只想在按下菜单按钮时执行某些操作,则应该只需实现onKeyDown()/ onKeyUp()来处理菜单键,就像处理任何其他键一样。请务必返回true表示您正在使用它,因此不执行默认键处理(通常涉及显示菜单面板)。
不要通过实现onCreateOptionsMenu()或onPrepareOptionsMenu()来实现。这些是您实现与选项菜单交互的钩子,而不是菜单键。无法保证在按下菜单键的任何关系中都会调用它们。碰巧它们经常发生,但API中没有任何定义说这是如此,事实上这显然是而不是的情况。
作为一般规则,依赖于这样的副作用(当用户按下菜单键时,这个未被记录为直接与菜单键绑定的API被调用)是你绝对应该避免的。根据定义,您依赖于实现细节,这很可能会让您感到厌烦。
例如从Android 3.0开始,当创建活动时立即调用onCreateOptionsMenu(),并且每当需要更新操作栏中的操作时调用onPrepareOptionsMenu()。这是因为选项菜单现在与操作栏集成在一起。
答案 1 :(得分:3)
快速解决方案(虽然我不建议)是使用
public boolean onPrepareOptionsMenu (Menu menu)
每次按下菜单按钮时都会调用此选项,就在显示菜单之前。 onCreateOptionsMenu的问题是它只在第一次创建菜单之前调用。所以这并不是说活动没有完成,而是用于启动活动的方法存在问题