在Android新版本中处理丢失的MENUbutton(3.x及更高版本)

我是Android 3.0使用的菜单button的粉丝,因为它对我的游戏应用程序非常有用 – 它允许我采取重要但玩法无关的function(保存游戏,参考信息链接)并将其放置在某处没有凌乱的主要游戏界面,但仍然很容易访问(选项菜单)。

这个按键的使用成为3.0的一个问题,因为它删除了菜单button,并用操作栏代替它。 操作栏真的不适合喜欢全屏播放的游戏,所以这是一个真正的痛苦。 没有操作栏 – 没有访问选项菜单。 不过,我可以忽略它一段时间,因为我没有那么多的用户在平板电脑上,没有时间来testing。

但是,ICS使这成为一个严重的问题,因为MENUbutton显然不会回来。 现在我不但要在平板电脑上处理这个问题,还要在手机上处理这个问题。

我对这个问题的最初解决方法是简单地在我的GUI中放置一个软button来replace硬菜单button

this.openOptionsMenu(); 

一切都回到了ICS的完美工作。

但是,这对Honeycomb不起作用。 调用openOptionsMenu如果没有可见的ActionBar,则完全没有任何作用。

有关如何处理这个问题的任何想法?

  • 我想我总是可以回到使用TargetSDK <11(从而迫使ActionBar出现在平板电脑上),但据我所知,这只是将问题推向未来,我不愿意这样做。

  • 完全放弃选项菜单,然后只使用上下文菜单? [澄清:通过这个我的意思是,而不是打开选项菜单 – 我只使用上下文菜单,因为 – 至less现在 – 这些工作在所有设备上]。

有兴趣听到其他谁有类似的问题,整个选项菜单/ ActionBar混乱决定做什么。

让我分享另一个菜单button变得至关重要的场景,即使它不是一个游戏。

我有应用程序执行自己的工具栏,其行为在某种程度上像ActionBar。 那么我做了,因为我的应用程序与1.5 sdk发布。 那个时候没有这个概念。 为了适应我的工具栏,我隐藏了默认的标题栏。 但是一些操作是通过Menufunction完成的。

现在,在Galaxy Nexus中没有菜单button,如果你不使用ActionBar,这是伤害我,因为我的应用程序仍然支持1.5。

那么有各种各样的工作,但没有一个是容易的。

也就是说,我想出的唯一工作就是给用户提供我的工具栏上的所有选项,所以根本不需要菜单。 我可以这样做,因为我只有两个不属于工具栏的操作。

在你的情况下,button的上下文菜单并不是一个糟糕的游戏,因为游戏将只有一个上下文运行,而上下文菜单中的每个项目都是不同的上下文。

顺便说一句,如果openOptionsMenu在ICS上工作,并且可以在一段时间后抛弃HoneyComb(即使现在用户openOptionsMenu太低),然后尝试根据版本给出两个菜单。

编辑:那么还有另一种方式来获得菜单s / wbutton在下面的导航栏。 只需将targetSdkVersion设置为小于11.有关更多详细信息, 请阅读整个soln。

但是,ICS使这成为一个严重的问题,因为MENUbutton显然不会回来。

更准确地说,设备制造商是否有屏幕上的button,而不是像菜单这样的东西。 引用Android 4.0的兼容性定义文档:

Home,Menu和Backfunction对于Android导航范例来说是必不可less的。 设备实现必须在运行应用程序时始终提供给用户这些function。 这些function可以通过专用物理button(如机械或电容式触摸button)来实现,也可以使用专用软件按键,手势,触摸屏等来实现。

所以,你不能指望有一个屏幕外的菜单button,虽然可能有一个。

有关如何处理这个问题的任何想法?

编写你自己的“菜单”作为游戏用户界面的一部分。 我不希望有一款游戏认为它需要全屏来使用选项菜单 – 事实上,我不记得曾经看到过这样做的游戏(虽然,我承认,我不是一个大的游戏玩家) 。 所有我玩过的游戏都不会在菜单上做任何事情。 相反,任何可能被认为是“菜单”的东西都直接在游戏用户界面中实现(例如,导致屏幕的button,在游戏用户界面的外观上进行了格式化,提供了要做的select)。

完全放弃选项菜单,然后只使用上下文菜单?

这将是可怕的,因为用户不知道在哪里长按菜单。

只要把最后一个钉在菜单button的谚语棺材,谷歌权衡与最后的告别:

http://android-developers.blogspot.com/2012/01/say-goodbye-to-menu-button.html

迈克尔,我处于完全相同的情况,并通过使用自定义对话框实现我的选项菜单解决了它。 ICS看起来比底部的遗留选项菜单更好。 它是这样configuration的

minSdkVersion = 8 targetSdkVersion = 14 SDK版本8(在eclipse settings.could设置为14,但我喜欢它提供的types安全)

API <10的用户使用硬菜单button并查看标准选项菜单。 API> = 10的用户在应用程序中看到一个三点图标(溢出菜单),点击获取我的自定义对话框菜单。 他们还可以在“设置”中看到新的ICS外观

似乎没有菜单button回来,我想打破传统障碍,即使只有1%的用户使用ICS。

回应最近的博客文章,他们似乎希望开发人员开始使用操作栏而不是菜单,但如果要支持API => 3.0和API <3.0,则会变得非常痛苦。 因此,要么创build一个与API <3.0(可以在SDK中find示例)兼容的自定义Action Bar,或者…上周我正在试验:

我也有一个问题,菜单button没有出现在我的ICS平板电脑上,我相信我当时的targetSdk设置为11,因为我想实现一个ActionBar。 然后,我将minSdk设置为3,targetSdk设置为4.出现ActionBar和菜单溢出button。 所以这是现在的解决方法(至less对于我正在进行的项目)。

我为3.x版本添加了一个特殊的逻辑。 只有这些版本我使用操作栏。

  if (Build.VERSION.SDK_INT == Build.VERSION_CODES.HONEYCOMB || Build.VERSION.SDK_INT == Build.VERSION_CODES.HONEYCOMB_MR1 || Build.VERSION.SDK_INT == Build.VERSION_CODES.HONEYCOMB_MR2) { requestWindowFeature(Window.FEATURE_ACTION_BAR); } else{ // hide the status bar, do not use action bar requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); } 

对于所有其他版本,我显示我自己的菜单button,并以全屏模式运行我的游戏。 当按下我的菜单button,我使用下面的代码行,其中“行为”是当前活动。

 act.openOptionsMenu(); 

作为菜单xml的一部分,确保有这样一行来设置“showAsAction”

 showAsAction="ifRoom"