最近客户反映,他们有些手机用的是华为或者三星的那种只有虚拟按键的。使用公司的app的时候,会出现虚拟按键跟app的导航栏重叠的问题。今天计划解决这个问题,百度了一下发现蛮多都不起作用,最后找到一个起作用的,非常感谢原作者,然后我做一个记录。
第一步,写一个工具类
public class NavigationBarUtil { public static void assistActivity(View content) { new NavigationBarUtil(content); } private View mChildOfContent; private int usableHeightPrevious; private ViewGroup.LayoutParams frameLayoutParams; private NavigationBarUtil(View content) { mChildOfContent = content; mChildOfContent.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { public void onGlobalLayout() { possiblyResizeChildOfContent(); } }); frameLayoutParams = mChildOfContent.getLayoutParams(); } private void possiblyResizeChildOfContent() { int usableHeightNow = computeUsableHeight(); if (usableHeightNow != usableHeightPrevious) { //将计算的可视高度设置成视图的高度 frameLayoutParams.height = usableHeightNow; mChildOfContent.requestLayout();//请求重新布局 usableHeightPrevious = usableHeightNow; } } private int computeUsableHeight() { //计算视图可视高度 Rect r = new Rect(); mChildOfContent.getWindowVisibleDisplayFrame(r); // 这里是调整顶起的高度,可以直接用r.bottom return (r.bottom); } }
第二步,在你的activity中调用如下方法,即可。
NavigationBarUtil.assistActivity(findViewById(android.R.id.content)); //透明状态栏 getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); //透明导航栏 getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
最终效果如下