遇到过一个蛋疼的问题,由于我的首页使用了androidslidingmenu,但是在5.0以上很多机型的虚拟导航navigationbar是可以弹出和收起的,例如华为的,而且是弹出的时候可以顶着布局上去的,可是当弹出以后无论怎么设置我的ui最下方都会被虚拟导航给挡住一截,于是考虑到slidingmenu才是最终attach到activity上的view,所以我用slidingmenu.setFitsSystemWindows(true),结果还是没有任何反应,
在这个AndroidResideMenu上面的源码上面的fitSystemWindows方法上是这样写的:
// This is added to fix soft navigationBar's overlapping to content above LOLLIPOP
int bottomPadding = viewActivity.getPaddingBottom() + insets.bottom;
boolean hasBackKey = KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_BACK);
boolean hasHomeKey = KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_HOME);
if (!hasBackKey || !hasHomeKey) { //there's a navigation bar
bottomPadding += getNavigationBarHeight();
}
this.setPadding(viewActivity.getPaddingLeft() + insets.left,
viewActivity.getPaddingTop() + insets.top,
viewActivity.getPaddingRight() + insets.right,
bottomPadding);
insets.left = insets.top = insets.right = insets.bottom = 0;
可是这里是判断如果有虚拟按键的时候它就给底部加上了bottomPadding虚拟按键的高度给它,然而并没有什么卵用,当收起虚拟按键的时候它原本是给加了一个高度,这样收下的时候底部就会出现有白色的底部,这明显是不对的。
最终,还是在万能的github上找到了答案,在slidingmenu 初始化的时候加上这个代码,它就自动修复了这个问题,当navigationbar弹出的时候,ui就会自动重新布局到navigationbar之上不被挡住:
我就在ResideMenu的构造方法上面加了这个
if(Build.VERSION.SDK_INT >= 21){
原答案链接:https://github.com/jfeinstein10/SlidingMenu/issues/680,里面还有很多种方法,重写fitsSystemWindows()方法加上navigationbar的高度会导致无论怎么样高度都不会变化,这样会导致导航栏是可以消失的,那么高度不会自动变化,不可行。所以最终使用了这种方法。
一试就可以了,现在无论是弹出虚拟按键还是收下,布局都会自动的收缩,显示正常,good