Immersive Navigation Bar (沉浸式导航栏)

Jun 4th, 2018 Jack Black


介绍

所谓沉浸式导航栏,即在app界面不显示(隐藏)导航栏。类似的概念还有“沉浸式状态栏 (immersive status bar)”等。

想要实现这样的效果,原则上是依赖app开发者的。但是基于国内安卓开发的现状,很多app开发者不遵守安卓开发规范(其实主要是领导给的压力),导致开发出的app用户界面神似iOS版,非常不美观。一个非常明显的特征就是,一直显示的黑色导航栏上方仍然叠加一个底部横向菜单。因此,为了获得更雅致的观感,我们需要手动帮这些app实现沉浸导航栏的效果。

测试环境

手机是索尼 Xperia Z5 Dual (E6683),系统为 Android 7.1.1. PC 为 ThinkPad S5,系统为 Windows 10. 以下实践均基于这个测试环境,不保证能在其他环境下取得相同结果(尽管理论上类原生系统的 7.0 都行)。

实现

利用安卓提供的 adb 命令 (Android Debug Bridge),我们可以在PC端轻松实现上述想法。将手机以 USB debugging 方式连接至电脑,然后在电脑命令行下进入adb的文件夹,用以下代码测试手机是否连接成功:

adb devices

如果连接成功,会返回如下结果(注意设备号可能不同):

List of devices attached
BH900F3V50      device  

然后使用这个命令即可全局沉浸导航栏:

adb shell settings put global policy_control immersive.navigation=*

有时对于某些应用我们并没有沉浸的企图,这时需要对它们给出例外。例如以下代码分别对我的手机的桌面、相机、相册、天气、ssrr等5个app做出了沉浸取消的例外。其中相机取消沉浸是因为沉浸后相机界面无法直接退出,ssrr取消沉浸是因为强制沉浸后再选择 Route 时会出错。另外三个app则是因为不沉浸更加美观。显然,只需要知道对应app的包名就可以轻松对任意app进行这种操作。

adb shell settings put global policy_control immersive.navigation=apps,-com.sonyericsson.home,-com.sonyericsson.android.camera,-com.sonyericsson.album,-com.sonymobile.xperiaweather,-in.zhaoj.shadowsocksrr

如果只想对某几个app做出沉浸修改,我猜想只需要这个命令(但我没有测试):

adb shell settings put global policy_control immersive.navigation=com.sonymobile.xperiaweather,com.sonyericsson.album

如果需要恢复系统原先的设置,只需键入如下命令即可:

adb shell settings put global policy_control null

其他

附上全局沉浸状态栏的命令:

adb shell settings put global policy_control immersive.status=*

以及全局全部沉浸的命令:

adb shell settings put global policy_control immersive.full=*

关于 adb 命令的更多神奇用法,我会在未来写新的博客更新,尽情期待。


Written & published @Peking University, 11:25 PM (UTC+08:00)


See All Blogs