华为等手机底部带有虚拟按键,会遮挡app的底部,针对这个问题网上有一些解决方案,但都不是很完美,或多或少存在一些问题。

下面推荐一个比较完美的适配方式。

public class AndroidWorkaround {
    public static void assistActivity(View content) {
        new AndroidWorkaround(content);
    }

    private View mChildOfContent;
    private int usableHeightPrevious;
    private ViewGroup.LayoutParams frameLayoutParams;

    private AndroidWorkaround(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);
        return (r.bottom);
    }

    public static boolean checkDeviceHasNavigationBar(Context context) {
        boolean hasNavigationBar = false;
        Resources rs = context.getResources();
        int id = rs.getIdentifier("config_showNavigationBar", "bool", "android");
        if (id > 0) {
            hasNavigationBar = rs.getBoolean(id);
        }
        try {
            Class systemPropertiesClass = Class.forName("android.os.SystemProperties");
            Method m = systemPropertiesClass.getMethod("get", String.class);
            String navBarOverride = (String) m.invoke(systemPropertiesClass, "qemu.hw.mainkeys");
            if ("1".equals(navBarOverride)) {
                hasNavigationBar = false;
            } else if ("0".equals(navBarOverride)) {
                hasNavigationBar = true;
            }
        } catch (Exception e) {

        }
        return hasNavigationBar;

    }

}

随后在activity的setContentView后调用即可

setContentView(R.layout.activity_main);
//适配虚拟按键
if (AndroidWorkaround.checkDeviceHasNavigationBar(this)) {
    AndroidWorkaround.assistActivity(findViewById(android.R.id.content));
}
 

以上转载:https://blog.csdn.net/wuhongjie24/article/details/80987142的文章,自己项目中亲测有效,供各位码友参考。

更多相关文章

  1. Android(安卓)后台保活,这里有你需要的所有姿势。2019,最新版本。
  2. Android(安卓)App监听软键盘按键的方式与改变软键盘右下角确定键
  3. Android(安卓)按键式事件
  4. android TV盒子开发遥控器按键的监听
  5. android沉浸式状态栏和虚拟按键
  6. Android(安卓)沉浸式全屏(StatusBar,NavigationBar)
  7. Android简易计算器——LinearLayout布局
  8. android 判断是否连接钢琴和检测钢琴是哪个按键
  9. 触摸按键Android的驱动解析

随机推荐

  1. Listview中的button点击事件
  2. Android(安卓)上传文件,头像。流形式
  3. Android(安卓)RelativeLayout(7.1) 源码
  4. Android(安卓)之 Fragment的动态加载
  5. android 修改默认浏览器的默认主页和去除
  6. Android(安卓)Studio在release模式下设置
  7. Android(安卓)程序获取、设置铃声、音量
  8. Android的Launcher显示默认apk
  9. Android学习第六周_SQLite和ContentProvi
  10. android AutoCompleteTextView 的 setAda