华为等手机底部带有虚拟按键,会遮挡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 App监听软键盘按键的方式与改变软键盘右下角确定键样式
  2. Android WIFI,蓝牙,电池,背光,SD卡,摄像头,按键,MIC,重力感应等)功能的简
  3. android TV盒子开发遥控器按键的监听
  4. Android 按键式事件
  5. android沉浸式状态栏和虚拟按键
  6. android 判断是否连接钢琴和检测钢琴是哪个按键
  7. 触摸按键Android的驱动解析
  8. 华为发布全新IDE:DevCro Studio,Facebook正自研OS系统!去除Google安
  9. Android及Robotium学习总结【环境变量,真机调试及根据id模拟按键

随机推荐

  1. Android(安卓)XML 三种解析方式
  2. 超级助手公告
  3. android view(2) Activity、Window、Deco
  4. SystemUI编译遇到的问题
  5. 在Androd studio 中,TextView设置Text居然
  6. Android官方文档之App Resources(下)
  7. Android(安卓)ConstraintLayout 布局解析
  8. Android(安卓)Studio NDK开发入门
  9. Android(安卓)TabHost(简易用法)
  10. Android(安卓)面试