最近开发当中遇到了如华为系列存在虚拟按键的手机会遮挡住应用本身的底部导航栏,网上找了很多代码发现解决了遮挡却不能与顶部渲染状态栏效果兼容,找了好久终于汇总了还算同时解决掉这两个问题的方案,话不多说直接上代码:
/**
* 判断底部navigator是否已经显示
*@paramwindowManager
*@return
*/
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
public static booleanhasSoftKeys(WindowManagerwindowManager){
Displayd=windowManager.getDefaultDisplay();
DisplayMetricsrealDisplayMetrics=newDisplayMetrics();
d.getRealMetrics(realDisplayMetrics);
intrealHeight=realDisplayMetrics.heightPixels;
intrealWidth=realDisplayMetrics.widthPixels;
DisplayMetricsdisplayMetrics=newDisplayMetrics();
d.getMetrics(displayMetrics);
intdisplayHeight=displayMetrics.heightPixels;
intdisplayWidth=displayMetrics.widthPixels;
return(realWidth-displayWidth) >0|| (realHeight-displayHeight) >0;
}
上面的方法是用来判断用户的手机是否存在虚拟键盘,然后来做相对应的处理,有了判断方法,我们在需要处理的界面的onCreate()方法中加入如下判断代码:
if(hasSoftKeys(getWindowManager())){
//有虚拟键的取消状态栏渲染防止底部导航栏被虚拟键遮挡
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.KITKAT){
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
}
}else{
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.KITKAT) {
getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
}
}
需要注意的是:只要存在如下方法就会有冲突问题
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); 所以我在判断有虚拟按键的时候就只加入了安卓4.4版本后渲染头部状态栏的代码,记得不要加这句代码就OK了,else之后的方法是没有虚拟键的手机正常渲染。
网友评论