处理新版本 Android(3.x 及更高版本)中缺少的 MENU 按钮
Posted
技术标签:
【中文标题】处理新版本 Android(3.x 及更高版本)中缺少的 MENU 按钮【英文标题】:Handling the missing MENU button in new versions of Android (3.x and up) 【发布时间】:2012-02-05 03:43:45 【问题描述】:我是 android
这种键的使用在 3.0 中成为一个问题,因为它删除了 MENU 按钮并用操作栏代替了它。 Action bar 真的不适合喜欢全屏运行的游戏,所以那是一个真正的痛苦。没有操作栏 - 无法访问选项菜单。不过,我可以暂时忽略它,因为我在平板电脑上没有那么多用户,也没有时间对此进行测试。
但是,ICS 使这成为一个严重的问题,因为 MENU 按钮显然不会再出现。现在,我不仅要在平板电脑上处理这个问题,还要在手机上处理。
我对这个问题的最初解决方案是在我的 GUI 中简单地放置一个软按钮来替换硬 MENU 按钮
this.openOptionsMenu();
一切都在 ICS 中恢复正常。
但是,这不适用于 Honeycomb。如果 ActionBar 不可见,则调用 openOptionsMenu 绝对不会执行任何操作。
关于如何处理这个问题的任何想法?
我想我总是可以回到使用 TargetSDK
完全放弃选项菜单,转而只使用上下文菜单? [澄清:我的意思是,我不是打开选项菜单——我只使用上下文菜单,因为——至少现在——这些适用于所有设备]。
有兴趣了解其他对整个选项菜单/操作栏混乱有类似问题的人决定做什么。
【问题讨论】:
好吧,我不太确定,但我有一个平板电脑,还有底部的栏(这叫什么,我猜不是操作栏,因为这是顶部的那个?)不会消失(它是带有 home、back、... 按钮的那个;实际上,它可能不会消失,这是操作系统强加的)。很多应用程序都会在那里出现一个选项按钮!你不能这样做吗?没有使用它,因此不知道如何制作它...编辑:阅读...这就是您返回使用 TargetSDK 假设您在谈论操作栏,那么是的。 你能告诉 wat 是你在你的应用程序中用于uses-sdk
的targetSdkVersion
吗?
不是 100% 确定(现在不在我的开发机器上),但它是 14 或 15。我喜欢保持目标 SDK 相对最新,尽管我仍然支持 Android 1.5。
【参考方案1】:
让我分享另一个场景,即使它不是游戏,菜单按钮也变得至关重要。
我有应用程序实现自己的工具栏,其行为在某种程度上类似于 ActionBar。好吧,我做到了,因为我的应用程序是用 1.5 sdk 发布的。当时还没有这个概念。为了适应我的工具栏,我隐藏了默认标题栏。但有些操作是通过菜单功能完成的。
现在,由于在 Galaxy Nexus 中,如果您不使用 ActionBar,则没有菜单按钮,这对我造成了伤害,因为我的应用仍然支持 1.5。
好吧,有各种变通方法,但没有一个是容易的。
也就是说,我想出的唯一解决方法是在我的工具栏上为用户提供所有选项,因此根本不需要菜单。我可以这样做,因为我只有两个不属于工具栏的操作。
在您的情况下,按钮上的上下文菜单在游戏中并不是一个糟糕的解决方案,因为与列表项上的上下文菜单(其中每个项目都是不同的上下文)相比,游戏将只有一个运行它的上下文。
顺便说一句,如果 openOptionsMenu
在 ICS 上工作,并且您可以在一段时间后放弃 HoneyComb(即使现在用户群太低),然后尝试同时提供两个菜单 based on the version。
编辑:还有另一种方法可以在下面的导航栏中获取 MENU s/w 按钮。只需将targetSdkVersion
设置为小于11。更多详情pls read the whole soln.
【讨论】:
提供这两个版本肯定是值得的,尽管我不确定 openOptionsMenu 如何(以及是否)适用于 ICS 中的平板电脑。我目前无法对此进行测试,因为 ICS + 平板电脑大小的模拟器在我的开发机器上不是朋友。 :-/ 在模拟器上基于平板电脑的开发很费时间......即使运行简单的应用程序也是问题你有一个游戏......;-)。现在要在 ICS 平板电脑上测试openOptionsMenu
,只需尝试创建一个小应用程序来测试模拟器中的菜单。大约一个小时后..;),你会知道的。如果它有效,那么您可以根据版本在两个菜单之间切换。您可以考虑为菜单创建帮助处理程序,这两种情况都可以重复使用。
如果模拟器甚至可以使用平板电脑大小的 ICS 启动一个实例,我可以做到这一点,到目前为止,它完全没有做到这一点。显然与 RAM 使用有关,但到目前为止,我还没有时间花在尝试让它工作上。
回复:编辑。这是我上面的选项 1,但你也会得到我绝对不想要的 ActionBar。
那么操作栏和导航栏是两个东西。操作栏通常位于顶部,导航栏位于底部,如link 所示。那么你想摆脱哪一个呢?顺便说一句,在你的情况下,你并不依赖于 Holo 主题,因为你有一个游戏。【参考方案2】:
但是,ICS 使这成为一个严重的问题,因为 MENU 按钮显然不会再回来了。
更准确地说,是否为 MENU 之类的功能提供屏幕外按钮取决于设备制造商。引用 Android 4.0 的兼容性定义文档:
Home、Menu 和 Back 功能对于 Android 导航范例至关重要。设备实现 在运行应用程序时,必须始终使这些功能对用户可用。这些功能可能是 通过专用的物理按钮(如机械或电容式触摸按钮)实现,或者可以是 使用专用软件按键、手势、触摸屏等实现。
因此,您不能指望有一个屏幕外的 MENU 按钮,尽管很可能有一个。
关于如何处理这个问题有什么想法吗?
编写您自己的“菜单”作为游戏 UI 的一部分。我不希望有一款游戏认为它需要全屏才能使用选项菜单——事实上,我不记得曾经见过这样做的游戏(尽管,我承认,我不是一个大游戏玩家) .我玩过的所有游戏在 MENU 按钮上都不起作用。相反,任何可能被视为“菜单”的东西都直接在游戏 UI 中实现(例如,通向屏幕的按钮,在游戏 UI 的外观中格式化,为要做的事情提供选择)。
完全放弃选项菜单,转而只使用上下文菜单?
这太糟糕了,因为用户不知道在哪里长按来调出菜单。
【讨论】:
"设备实现必须使这些功能在运行应用程序时始终可供用户使用。" - 这完全没有意义,因为谷歌自己的 Galaxy Nexus 根本不这样做。 "那太糟糕了,因为用户不知道在哪里长按来调出菜单。"他们会知道按下显示菜单的按钮,这将弹出一个上下文菜单,而不是像我现在所做的那样 - 一个仅在非 3.x 设备上出现的选项菜单。 @MichaelA:我有一个 Galaxy Nexus,我不记得菜单按钮不可见的情况。需要详细说明吗? “按下显示菜单的按钮,它将弹出一个上下文菜单” - 相反,当他们按下显示“菜单”的按钮时,您会显示一个带有菜单选项的AlertDialog
吗?还是PopupWindow
?还是其他让用户体验更受您控制的事情?
嗯...您所说的菜单按钮是什么?在我的手机上,我始终可以使用三个按钮(从左到右):返回、主页和最近使用的应用程序按钮。如果您(和 CDD 文档)将后者称为“菜单”按钮,那么我们在谈论一些交叉用途:我指的是原始菜单按钮范例(至少在 Android 中使用2.3 版),这显然与 ICS 中的 GUI 范例不同。当然,这也是问题的本质——如何最好地处理这个 GUI 范式在操作系统版本之间发生根本性的变化。
@MichaelA.:抱歉——操作栏菜单按钮/触发器/无论您想调用什么,它都会在需要时出现,除非在不使用操作栏的应用程序中。我之前的评论并没有直接考虑——我很抱歉。【参考方案3】:
为了在菜单按钮这个众所周知的棺材里放上最后一个尖峰,Google 最终道别:
http://android-developers.blogspot.com/2012/01/say-goodbye-to-menu-button.html
【讨论】:
【参考方案4】:迈克尔,我遇到了完全相同的情况,并通过使用自定义对话框实现我的选项菜单来解决它。它在 ICS 上看起来比底部的旧选项菜单更好。是这样配置的
minSdkVersion = 8 targetSdkVersion = 14 SDK 构建版本 8(在 Eclipse 中设置。可以设置为 14,但我喜欢它提供的类型安全)
API = 10 的用户会在应用程序中看到一个三点图标(溢出菜单),然后单击获取我的自定义对话框菜单。他们还可以在“设置”等中看到新的 ICS 外观。
菜单按钮似乎没有回来,我想打破传统障碍,尽管我只有
【讨论】:
【参考方案5】:响应最近的博客文章,他们似乎希望开发人员开始使用操作栏而不是菜单,但是如果想要支持 API => 3.0 和 API
我还遇到了一个问题,即我的 ICS 平板电脑上没有出现菜单按钮,我相信当时我将 targetSdk 设置为 11,因为我想实现一个 ActionBar。然后我将 minSdk 设置为 3,将 targetSdk 设置为 4。ActionBar 和菜单溢出按钮都出现了。所以这是现在的解决方法(至少对于我正在从事的项目)。
【讨论】:
【参考方案6】:我为 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"
【讨论】:
以上是关于处理新版本 Android(3.x 及更高版本)中缺少的 MENU 按钮的主要内容,如果未能解决你的问题,请参考以下文章
QuartzCore 框架与 Xcode 5 及更高版本中的 UIKit 框架捆绑在一起? [复制]
为啥支持 C++11 及更高版本的 C++ 编译器需要 Boost.SmartPtr?
Modern OpenGL 3.x 及更高版本如何绘制图元?
从 Cake 1.3 迁移到 2.0 及更高版本 - 迁移现有的,还是仅用于新的?