39

我是 Android <3.0 中使用的菜单按钮的粉丝,因为它对我的游戏应用程序非常有用 - 它允许我使用重要但与游戏玩法无关的功能(保存游戏、参考信息链接)并将其放置在它的某个位置没有弄乱主游戏界面,但仍然很容易访问(选项菜单)。

这种键的使用在 3.0 中成为一个问题,因为它删除了 MENU 按钮并用 Action Bar 代替了它。动作栏真的不适合喜欢全屏运行的游戏,所以那是一个真正的痛苦。没有操作栏 - 无法访问选项菜单。但是,我可以暂时忽略它,因为我在平板电脑上没有那么多用户并且没有时间来测试它。

然而,ICS 使这成为一个严重的问题,因为 MENU 按钮显然不会回来。现在我不仅要在平板电脑上处理这个问题,而且还要在手机上处理。

我对这个问题的最初解决方案是在我的 GUI 中简单地放置一个软按钮来替换硬 MENU 按钮

this.openOptionsMenu();

一切都恢复到在 ICS 中完美运行。

但是,这不适用于 Honeycomb。如果 ActionBar 不可见,则调用 openOptionsMenu 绝对不会执行任何操作。

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

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

  • 完全放弃选项菜单,转而只使用上下文菜单?[澄清:我的意思是,我不是打开选项菜单——我只使用上下文菜单,因为——至少现在——这些适用于所有设备]。

有兴趣听听其他对整个选项菜单/操作栏混乱有类似问题的人决定做什么。

4

6 回答 6

17

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

我有应用程序实现自己的工具栏,其行为在某种程度上类似于 ActionBar。好吧,我做到了,因为我的应用程序是用 1.5 sdk 发布的。当时还没有这个概念。为了适应我的工具栏,我隐藏了默认标题栏。但有些操作是通过菜单功能完成的。

现在,由于在 Galaxy Nexus 中,如果您不使用 ActionBar,则没有菜单按钮,这对我造成了伤害,因为我的应用程序仍然支持 1.5。

好吧,有各种解决方法,但没有一个是容易的。

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

在您的情况下,按钮上的上下文菜单在游戏中并不是一个坏解决方案,因为与在每个项目都是不同上下文的列表项上具有上下文菜单相比,游戏将只有一个运行它的上下文。

顺便说一句,如果openOptionsMenu适用于 ICS 并且您可以在一段时间后放弃 HoneyComb(即使现在用户群太低),然后尝试根据版本提供两个菜单。

编辑:还有另一种方法可以在下面的导航栏中获取 MENU s/w 按钮。只需将 设置targetSdkVersion为小于 11。有关更多详细信息,请阅读整个解决方案。

于 2012-01-08T19:33:31.770 回答
2

然而,ICS 使这成为一个严重的问题,因为 MENU 按钮显然不会回来。

更准确地说,是否为 MENU 之类的东西提供屏幕外按钮取决于设备制造商。引用 Android 4.0 的兼容性定义文档:

Home、Menu 和 Back 功能对于 Android 导航范例至关重要。设备实现必须在运行应用程序时始终使这些功能对用户可用。这些功能可以通过专用的物理按钮(如机械或电容式触摸按钮)来实现,也可以使用专用的软件按键、手势、触摸面板等来实现。

所以,你不能指望有一个屏幕外的菜单按钮,尽管很可能有一个。

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

编写自己的“菜单”作为游戏 UI 的一部分。我不希望有一款游戏认为它需要全屏才能使用选项菜单——事实上,我不记得曾经见过这样做的游戏(尽管,我承认我不是一个大游戏玩家) . 我玩过的所有游戏在 MENU 按钮上都不起作用。相反,任何可能被视为“菜单”的东西都直接在游戏 UI 中实现(例如,通向屏幕的按钮,在游戏 UI 的外观中格式化,为要做的事情提供选择)。

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

那会很糟糕,因为用户不知道在哪里长按来调出菜单。

于 2012-01-08T13:19:29.687 回答
2

只是为了在菜单按钮的众所周知的棺材中放最后一个尖峰,谷歌最后道别:

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

于 2012-01-27T00:58:43.513 回答
0

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

minSdkVersion = 8 targetSdkVersion = 14 SDK 构建版本 8(在 Eclipse 设置中。可以设置为 14,但我喜欢它提供的类型安全)

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

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

于 2012-01-12T18:06:39.317 回答
0

回应最近的博客文章,他们似乎希望开发人员开始使用操作栏而不是菜单,但如果想要支持 API => 3.0 和 API < 3.0,这将变得很痛苦。所以要么创建一个与 API < 3.0 兼容的自定义操作栏(你可以在 SDK 中找到示例),或者......我上周正在尝试这个:

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

于 2012-01-28T02:12:12.990 回答
-2

我为 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);               
            }

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

act.openOptionsMenu();

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

showAsAction="ifRoom"
于 2012-07-04T07:00:52.233 回答