【问题标题】:Start PreferenceActivity with menu button and finish with back button使用菜单按钮启动 PreferenceActivity 并使用后退按钮完成
【发布时间】:2011-08-10 12:28:50
【问题描述】:

我修改了 CommonsWare 的 prefenceActivity 应用程序,但遇到了问题。

我想用菜单按钮启动一个 prefenceActivity,然后用返回按钮完成它。

我有这个通过菜单按钮启动我的 prefenceActivity:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    startActivity(new Intent(this, EditPreferences.class));
    return(true);
}

它确实回到了我的应用程序主视图,但我认为它还没有完成,因为当我再次按下菜单按钮时,prefenceActivity 不会再次弹出。我必须关闭我的应用,然后它只能再次运行 1 次。

当我按下后退按钮时,我已经尝试在我的 prefenceActivity 中完成它,但这也没有帮助。

我做错了什么?

感谢您的帮助!

【问题讨论】:

  • “我想用菜单按钮启动一个 prefenceActivity,然后用返回按钮完成它”——为什么?为什么要以这种方式破坏 UI?为什么要让习惯了菜单按钮调出菜单的用户感到困惑?用户和媒体成员讨厌缺乏纪律、无正当理由违反 UI 模式的开发人员。他们在文章、博客文章/cmets 等中大声抱怨。因此,Android 应用程序成为许多投诉的目标,如果您坚持下去,您的应用程序将成为其中的另一个。

标签: android menu back-button android-preferences


【解决方案1】:

一个快速的解决方案(虽然我不建议这样做)是使用

public boolean onPrepareOptionsMenu (Menu menu)

每次按下菜单按钮时都会调用它,就在菜单显示之前。 onCreateOptionsMenu 的问题是它只在第一次创建菜单之前被调用。所以这不是活动没有完成,而是你用来启动活动的方法有问题

【讨论】:

  • 打败我。正确,onCreateOptionsMenu() 仅在第一次使用选项菜单时调用一次。
  • 感谢您快速明确的回答。这正是我想要的。
  • 请不要这样做。请参阅下面的答案。
  • 这是一种解决方案,虽然我同意 hackbod,但还有更好的方法。请查看 hackbod 的答案(尽管这是公认的答案)
【解决方案2】:

如果您只想在按下菜单按钮时做一些事情,您应该简单地实现 onKeyDown()/onKeyUp() 来处理菜单键,就像处理任何其他键一样。确保返回 true 表示您正在使用它,因此不会执行默认键处理(通常涉及显示菜单面板)。

不要通过实现 onCreateOptionsMenu() 或 onPrepareOptionsMenu() 来做到这一点。这些是您实现与选项菜单交互的钩子,而不是与菜单键交互。不能保证这些将在与被按下的菜单键有任何关系的情况下被调用。碰巧它们经常是这样,但 API 中没有定义任何东西说这是这样,而且确实不是是这种情况。

作为一般规则,您绝对应该避免依赖这样的副作用(哦,当用户按下菜单键时,此 API 未记录为直接绑定到菜单键被调用)。根据定义,您依赖于实现细节,这很有可能会咬到您。

例如,从 Android 3.0 开始,当有一个操作栏时,onCreateOptionsMenu() 会在活动创建时立即调用,而 onPrepareOptionsMenu() 会在操作栏中的操作需要更新时调用。这是因为选项菜单现在与操作栏集成在一起。

【讨论】:

  • +1:没有考虑交互的差异。很好的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-05
  • 1970-01-01
  • 2018-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多