Android:以编程方式检测设备是不是有硬件菜单按钮
Posted
技术标签:
【中文标题】Android:以编程方式检测设备是不是有硬件菜单按钮【英文标题】:Android: Programmatically detect if device has hardware menu buttonAndroid:以编程方式检测设备是否有硬件菜单按钮 【发布时间】:2012-02-21 03:03:54 【问题描述】:我目前正在努力解决这个问题。我需要检查安装应用程序的设备是否有硬件菜单键。因为它在 Galaxy Nexus 等某些设备上不存在,所以在这种情况下,我直接在 UI 中显示它。
我已经查看了 PackageManager.hasSystemFeature(),但没有发现任何有用的东西。
有人已经这样做了吗?
【问题讨论】:
嗨。感谢您的回答。我想使用操作栏,因为我认为它占用了很多空间。在 Galaxy Nexus 上,我可以在 UI 中显示一个菜单按钮,但是当你有一个带 ICS 的 Nexus S 时,这个按钮就变得不必要了,因为 Nexus S 有一个硬件菜单按钮。 更好的分辨率***.com/questions/16092431/check-for-navigation-bar 【参考方案1】:ViewConfiguration.get(context).hasPermanentMenuKey()
请参阅ViewConfiguration#hasPermanentMenuKey()
了解更多信息。请注意,这仅适用于 API 级别 14+(android 4.0 Ice Cream Sandwich 或更高版本)。
【讨论】:
仅适用于 API 级别 >= 14 developer.android.com/reference/android/view/… 在 API 11 - 13 上,您可以假定 MENU 不存在。 @fhucho 这对我没有帮助。我需要支持 API 级别 10 以上,所以如果我尝试使用它,Eclipse 会引发错误。我想通过在有硬件菜单键且操作栏上没有溢出菜单时发出祝酒词来引起用户对溢出菜单项的注意。无论是否有硬件菜单键,溢出菜单图标并不总是显示,这真的很烦人。 (顺便说一句,我不明白你的最后评论。) 您需要将构建目标设置为 API 级别 14,这应该可以阻止 Eclipse 抱怨。在您的代码中,检查什么是 API 级别。如果它是 10 或更少,则该设备确实有硬件菜单按钮。如果是 11 - 13(Honeycomb),则设备没有 HW MENU 按钮,因为带有 Honeycomb 的平板电脑没有 MENU。如果 API 级别为 14 或更高,则可以使用 hasPermanentMenuKey()。 作为参考,我有一个带有硬件菜单键的 API 14 设备(4.0.3),hasPermanentMenuKey()
报告错误。在此处插入皱眉脸。【参考方案2】:
if(Build.VERSION.SDK_INT <= 10 || (Build.VERSION.SDK_INT >= 14 &&
ViewConfiguration.get(this).hasPermanentMenuKey()))
// menu key is present
else
//No menu key
【讨论】:
这是不正确的。对于低于 11 的 API,它会因为无法调用“hasPermanentMenuKey()”函数而崩溃。这是因为它存在于 API 14 及更高版本。 据我所知,它不会调用 hasPermanentMenuKey() 因为检查 >= 14 将失败并且不会进行调用。也就是说,每次我使用特定于 API 的方法时,我总是创建一个方法 xxV14() 来处理它,这样我就可以正确地忽略警告,而不必担心其他调用不被处理。 是的,Build.VERSION.SDK_INT >= 14
必须为真,才能对其余部分进行评估。请注意,Honeycomb (API 11–13) 仅在平板电脑上可用,并且它们不应该有菜单按钮。因此,如果您的目标是决定是否在 UI 中显示菜单按钮,则此代码应该适用于所有 API 版本。唯一不希望出现的影响是,如果您遇到带有物理菜单按钮的 Honeycomb 平板电脑(不确定是否存在),那么问题只是表面上的。另请参阅android-developers.blogspot.de/2012/01/…。【参考方案3】:
即使在运行 Honeycomb 及更高版本的设备上,系统也会为为 2.x 版本的 Android 编写的应用程序提供“菜单按钮”。只有它被称为“溢出菜单”。因此,检查是否会有这样的按钮是没有意义的——如果需要,它就会出现。
作为一般准则,您应该检查特定功能,而不是查看系统/API 版本号。如果 ActionBar 类可用,则使用它,否则回退到 2.x 选项菜单。
你看过Google’s action-bar tutorial吗?这让你更清楚你应该做什么。
【讨论】:
忘了说这个了:我当然先尝试了legacy模式,但是这种情况下listview的性能真的很糟糕,因为缺少硬件加速。而一旦你将tagetSDK设置为14,你将再次拥有硬件加速,但没有溢出菜单。这就是我直接在 UI 中显示菜单按钮的原因,但如果设备有硬件菜单按钮,我想隐藏它。 如果系统有一个 ActionBar 类,则菜单/“溢出”按钮仅在您的应用不支持 ActionBar 时才会显示(在您的情况下这是错误的)。因此,与其检查哪里有这样的按钮,不如检查 ActionBar 类是否可用。 @Lawrence D'Oliveiro:这并不完全正确。如果主题设置为全屏,则操作栏不会显示在任何 Android 版本的任何设备上。这意味着在没有硬件菜单按钮的设备上,将无法访问选项菜单/操作栏/溢出。将主题设置为全屏将在所有设备上显示活动,就像它们是蜂窝前一样。对于设置为不显示标题栏的主题也是如此,因此,对于在全屏模式或无标题栏模式下运行的应用程序,检查硬件菜单是必要的,并且需要提供后备。【参考方案4】:我认为一个可能的更好的解决方案是添加一个自己的操作栏。所以每台设备都可以看到它,你不必检查硬件配置或 Api 版本。
【讨论】:
【参考方案5】:keysoft 限定符用于检测硬件键盘而不是导航栏。
这篇文章解决了:
Check for navigation bar
【讨论】:
【参考方案6】:如果您想要一个资源限定符(可能是因为您想要区分 UI),请使用 keyssoft
资源限定符。
【讨论】:
keysoft 限定符用于检测硬件键盘而不是导航栏。以上是关于Android:以编程方式检测设备是不是有硬件菜单按钮的主要内容,如果未能解决你的问题,请参考以下文章