Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/231.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android:以编程方式检测设备是否有硬件菜单按钮_Android_Menu_Key_Hardware - Fatal编程技术网

Android:以编程方式检测设备是否有硬件菜单按钮

Android:以编程方式检测设备是否有硬件菜单按钮,android,menu,key,hardware,Android,Menu,Key,Hardware,我目前正在努力解决这个问题。我需要检查安装应用程序的设备是否有硬件菜单键。因为它在Galaxy Nexus等设备上不存在,所以在本例中,我将直接在UI中显示它 我已经查看了PackageManager.hasSystemFeature(),但没有发现任何有用的内容 有人已经这样做了吗?即使在运行蜂巢和更高版本的设备上,系统也会为为为2.x版本Android编写的应用程序提供一个“菜单按钮”。只有它被称为“溢出菜单”。因此,检查是否会有这样一个按钮是没有意义的,如果需要的话,它会在那里 一般来说,

我目前正在努力解决这个问题。我需要检查安装应用程序的设备是否有硬件菜单键。因为它在Galaxy Nexus等设备上不存在,所以在本例中,我将直接在UI中显示它

我已经查看了PackageManager.hasSystemFeature(),但没有发现任何有用的内容


有人已经这样做了吗?

即使在运行蜂巢和更高版本的设备上,系统也会为为为2.x版本Android编写的应用程序提供一个“菜单按钮”。只有它被称为“溢出菜单”。因此,检查是否会有这样一个按钮是没有意义的,如果需要的话,它会在那里

一般来说,您应该检查特定的功能,而不是查看系统/API版本号。如果ActionBar类可用,请使用它,否则返回到2.x选项菜单

你看过吗?这让你更清楚你应该做什么

ViewConfiguration.get(context).hasPermanentMenuKey()

有关更多信息,请参阅。请注意,这仅适用于API级别14+(Android 4.0冰淇淋三明治或更高版本)。

我认为一个可能更好的解决方案是添加自己的actionbar。因此,每个设备都可以看到它,而不必检查硬件配置或Api版本。

if(Build.version.SDK_INT=14&&
if(Build.VERSION.SDK_INT <= 10 || (Build.VERSION.SDK_INT >= 14 &&    
                              ViewConfiguration.get(this).hasPermanentMenuKey()))
{
   // menu key is present
}
else
{
  //No menu key
}
ViewConfiguration.get(this.hasPermanentMenuKey())) { //菜单键存在 } 其他的 { //没有菜单键 }
如果您想要一个资源限定符,这可能是因为您想要区分UI,请使用
keysoft
资源限定符。

keysoft限定符用于检测硬件键盘,而不是导航栏

本文解决了这个问题:


你好。谢谢你的回答。我想使用动作条四处走动,因为我认为它会占用很多空间。在Galaxy Nexus上,我可以在UI中显示一个菜单按钮,但是当你有一个带有ICS的Nexus S时,这个按钮就变得不必要了,因为Nexus S有一个硬件菜单按钮。更好的分辨率忘了提到这一点:当然我先尝试了传统模式,但在这种情况下,由于缺少硬件加速,listview的性能非常糟糕。一旦您将tagetSDK设置为14,您将再次进行硬件加速,但不会出现溢出菜单。这就是我直接在UI中显示菜单按钮的原因,但如果设备有硬件菜单按钮,我想将其隐藏。如果系统有ActionBar类,则只有在应用程序不知道ActionBar时才会显示菜单/“溢出”按钮(在您的情况下,这是错误的)。因此,与其检查哪里有这样的按钮,不如检查ActionBar类是否可用。@Lawrence D'Oliveiro:这并不完全正确。如果主题设置为全屏,则在任何Android版本的任何设备上都不会显示actionbar。这意味着在没有硬件菜单按钮的设备上,无法访问选项菜单/操作栏/溢出。将主题设置为全屏将在所有设备上显示活动,就像预蜂窝一样。对于设置为不显示标题栏的主题也是如此,因此,对于在全屏模式或notitlebar模式下运行的应用程序,检查硬件菜单是必要的,并且需要提供回退。仅在API 11-13上的API级别>=14时可用,您可以假定该菜单不存在。@fhuch这对我没有帮助。我需要支持10级以上的API,所以如果我尝试使用它,Eclipse将引发一个错误。我想提醒用户注意溢出菜单项,当操作栏上有硬件菜单键,因此没有溢出菜单时,我会发出一个toast。不管是否有硬件菜单键,溢出菜单图标并不总是显示,这真是令人恼火。(顺便说一句,我不理解您最后的评论。)您需要将构建目标设置为API级别14,这应该可以防止Eclipse抱怨。在代码中,检查API级别。如果小于等于10,则该设备确实具有硬件菜单按钮。如果是11-13(蜂巢),设备没有HW菜单按钮,因为带有蜂巢的平板电脑没有菜单。如果API级别为14或更高,则可以使用hasPermanentMenuKey()。作为参考,我有一个带有硬件菜单键的API 14设备(带有4.0.3),并且
hasPermanentMenuKey()
报告为false。在此处插入皱眉面。这是不正确的。对于低于11的API,它将崩溃,因为它无法调用“hasPermanentMenuKey()”函数。这是因为它存在于API 14和更高版本中。据我所知,它不会调用hasPermanentMenuKey(),因为检查>=14将失败,并且不会进行调用。也就是说,每次我使用特定于API的方法时,我总是创建一个方法xxV14()来处理它,这样我就可以正确地忽略警告,而不用担心其他调用没有得到处理。是的,
Build.VERSION.SDK_INT>=14
必须为真,才能对其余的进行计算。请注意,蜂巢(API 11–13)仅在平板电脑上提供,而且它们不需要菜单按钮。因此,如果您的目标是决定是否在UI中显示菜单按钮,则此代码应适用于所有API版本。唯一不受欢迎的影响是,如果你曾经遇到一个带有物理菜单按钮的蜂窝平板电脑(不确定是否存在),那么问题只是表面上的。另请参见。keysoft限定符用于检测硬件键盘,而不是导航栏。