我正在开发一款已移植到Android的跨平台应用。由于其非Android版本,它没有广泛使用Android UI元素 - 主应用程序窗口是一个View
。
我希望实现从KitKat开始支持的半透明系统(状态和导航)栏,同时确保主View
内的UI元素不受其阻碍。
This answer显示如何获取这些栏的默认高度(横向模式下导航栏高度也为navigation_bar_height_landscape
,垂直导航栏宽度为navigation_bar_width
) 。但这些只是系统的默认大小,如果当前正在显示导航栏,则不包含任何信息,以及它是显示在屏幕的右边还是底边。
到目前为止,我发现的其他答案可能适用于非半透明系统条:它们只是将总屏幕大小与主应用程序视图的大小进行比较,差异是系统条占用的空间。但是,对于半透明系统条,尺寸差异为零,这种方法不起作用。
如何可靠地确定导航栏是否正在显示以及在哪个位置?
答案 0 :(得分:2)
环顾一下,包括this part的AOSP代码,我想出了以下内容:
// determine if navigation bar is going to be shown
Boolean isNavShowing;
if (Build.VERSION.SDK_INT >= 13) {
isNavShowing = ViewConfiguration.get(activity.getApplication()).hasPermanentMenuKey();
}
// determine where the navigation bar would be displayed
Boolean isNavAtBottom;
if (Build.VERSION.SDK_INT >= 13) {
isNavAtBottom = (activity.getResources().getConfiguration().orientation != Configuration.ORIENTATION_LANDSCAPE)
|| (activity.getResources().getConfiguration().smallestScreenWidthDp >= 600);
}
然后您可以计算以下插图:
status_bar_height
navigation_bar_width
navigation_bar_height_landscape
;别的navigation_bar_height
。根据dimens.xml,默认值为:
status_bar_height
:24 dp navigation_bar_height
:48 dp navigation_bar_height_landscape
:48 dp navigation_bar_width
:48 dp (如果以某种方式无法获得实际值,您可能希望回归到这些。)
isNavShowing
的逻辑是我之前实施的内容的变体。即使在运行CyanogenMod的OnePlusOne上(用户可以通过设置在导航栏和硬件按钮之间切换),它也可以可靠地检测到物理菜单按钮的存在。即使向导航栏添加软件菜单按钮(似乎是CM添加),仍然可以正确检测导航栏。
isNavAtBottom
的逻辑主要来自我上面链接的源文件中的findNavigationBar()
函数,除非您使用的是大量自定义的Android版本,否则它应该有效。