前(tu)言(cao)
(前情提要,想看正文不想看吐槽的请往页底翻谢谢)
大兄弟,你有听说S8的底部导航栏可以隐藏么?
当听说的时候真tm想死
为啥?
做沉浸式适配方案的想要砍死你好么?
君不见之前某酷派也干过这蠢事么?
还好人家那是4.x年代,沉浸式没搞得那么火呢...
问题在哪?
说到沉浸式大家都很熟悉了,在这个动辄安卓8.0即将到来,7.x满天飘,6.x遍地走,5.x已过时的年代再没个沉浸式?啧啧,都不好意思说你是干安卓的了。
那么,大兄弟,你有听说S8的底部导航栏可以隐藏么?
在三星S8全面屏安卓机皇上,为了“更好的体验”全面屏的效果,三星在系统底层加入了安卓虚拟导航栏可隐藏设计,真是棒棒哒...nmmp哟,你tm一会出来了一会收回去了让俺们程序怎么计算可用面积高度啊(╯—﹏—)╯(┷━━━┷
咳咳...素质素质...修养是一辈子的事.......
做过安卓沉浸式的都知道,安卓沉浸式本质上实际是将本Activity添加了一个全屏的Flag,然后让上边的状态栏和下边的导航栏透明的一个过程,在这个过程中不可避免的出现本来设计在Activity上的一部分布局被状态栏和导航栏遮挡的问题,简单点说就是如下图所示的问题了:
这个问题在我们的BaseActivity(http://www.jianshu.com/p/ea92b765a946)中用一个占位布局sys_statusBar来进行解决了,它的作用就是由BaseActivity在启动后获取系统状态栏的高度,自动设置sys_statusBar高度,然后将Activity布局其他内容从状态栏的位置挤下去就ok了。
那么针对底部导航栏怎么办呢?
我们使用一个盒子模型布局box_body来嵌套所有内容,并设置box_body的高度等于屏幕可用部分区域的高度即可。
但现在问题又来了,针对某些可以自由隐藏和显示底栏的手机,现有的方法会在隐藏底栏时使其在底栏部分留下一个空白的区域此问题如何解决呢?
查阅了一大堆资料发现,问题解决的钥匙还是在android:fitsSystemWindows="true"这句代码身上。
解决问题
android:fitsSystemWindows="true"
这句话到底是什么意思呢?
实质上它的作用就是将设置有此属性的布局,动态的适配屏幕可用空间的高度。
那么问题就简单了,不需要sys_statusBar,只需要做一个将内容布局放在其中的盒子模型(LinearLayout或RelativeLayout),设置其属性android:fitsSystemWindows="true"系统就会自动设置其高度适配屏幕可用面积,问题得以解决。
这次出现适配问题主要也在于对fitsSystemWindows属性的不理解上,下个版本的BaseActivity将更新适配方案,敬请期待。
如果本文对您有所帮助麻烦点个赞,如有疑问欢迎在评论区留言交流。