能否通过编程检测Android虚拟按钮?

3

Android似乎在使用虚拟/屏幕按钮的设备上会剪切掉底部的100px。是否有可能检测当前手机/平板电脑是否使用屏幕按钮,以便我能够考虑到缺失的空间?如果可以,是否还可以获取按钮的高度?

2个回答

2
您可以使用 hasPermanentMenuKey() 来检查设备是否具有永久(硬件)菜单按钮。可以按以下方式使用它:
boolean hasMenuKey = ViewConfiguration.get(context).hasPermanentMenuKey();

请注意,此技术仅适用于API 14+(ICS,JB)。没有API-11之前的设备有菜单按钮,因此只剩下API 11-13没有检查;请记住,这3个API级别目前仅占Android人口的2.3%。
或者(虽然不可靠),您可以尝试搜索D-Pad:
boolean hasDpad = getResources().getConfiguration().naviation == Configuration.NAVIGATION_DPAD;

无法检查硬件搜索按钮(我也会假定home/back按钮同样如此),就像在这里所见here。(还有here;这个线程提出了一种替代方法,但我不确定它是否适用于您的情况。)
我要提到两件事:虚拟按钮永远不应该覆盖您的内容。它们会减少设备窗口的高度(由显示器的度量获取),但如果您使用match_parent作为高度,则它们永远不会妨碍您的布局。其次,无法获取虚拟按钮栏的确切高度;它可能会在构建之间发生变化。Android API中也没有本地方法来获取“可用”屏幕空间(底部未被栏覆盖的区域)。
所以,这是我要建议的:

谢谢!似乎我无能为力。但是至少在Nexus 7上,虚拟按钮确实覆盖了我的内容,尽管设置了match_parent。我能找到的最快的测试是使用match_parent填充一个ScrollView。表示您无法滚动更远的薄蓝线被切断了带有按钮的边缘。(在我的情况下,如果不考虑它,就会消失在屏幕外面有一个可拖动的手柄,高度大约相同)。但愿我错了,因为我还没有测试过没有手柄逻辑。如果是我做错了什么,那就容易修复多了。 - Xlythe
非常奇怪,我的Galaxy Nexus上没有这个问题。不幸的是,我没有Nexus 7来确认它。抱歉我帮不了更多! - Cat
填充!哦天啊。填充是导致我的问题的原因。我...现在感到很尴尬。但谢天谢地,这是我的错。 - Xlythe
同意!很高兴你现在已经解决了它! :) - Cat

0

据我所记,底部的虚拟按钮仅适用于Android 3.0(蜂巢)及以上版本。至于高度问题,我从未深入研究过。


然而,他们仍然会制造带有硬件按钮的手机,因此我不能假设所有3.0+设备都将具有虚拟按钮。 - Xlythe
Kindle Fire有一个虚拟按钮栏,并运行着gingerbread(2.3)。 - Geert Weening

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接