小米获取屏幕高度不准确-小米获取屏幕高度的兼容方案

今天发现,小米8手机获取屏幕高度的方法不准确,进过一些测试以后发现是虚拟导航按键出了问题。

这里获取屏幕高度的方法用的是

public static int getScreenHeight(Activity activity) {
        DisplayMetrics dm = new DisplayMetrics();
        activity.getWindowManager().getDefaultDisplay().getMetrics(dm);
        int height = dm.heightPixels;
        return height;
    }

我们知道这个方法获取屏幕高度的时候

1.当屏幕有虚拟按键的情况下,获取的是屏幕顶部到虚拟按键上部的距离。

2.当屏幕没有虚拟按键的情况下,获取的是屏幕顶部到屏幕底部的距离。

因为我们的页面元素一般不希望被虚拟按键遮挡,所以这个方法一般是我们所希望的。

但是经过测试,小米8手机在虚拟按键未设置的情况下,依然返回的是情况1的高度。这样返回的高度实际缺少了虚拟按键的高度。

根据查阅资料,我猜测是因为获取虚拟按键状态的系统方法在小米系统内不能正常使用,导致这个获取屏幕高度的方法认为虚拟按键是开启状态。(因为懒,所以没去深究源码)。

既然知道了原因,接下来就是去解决了。

直接上代码

获取高度的方法

     /**
     * 获取屏幕高度
     *
     * @param activity
     * @return
     */
    public static int getScreenHeight(Activity activity) {
        DisplayMetrics dm = new DisplayMetrics();
        activity.getWindowManager().getDefaultDisplay().getMetrics(dm);
        int height = dm.heightPixels;
        return height+BottomBtnUtils.getMiSupplementHeight(activity);
    }

获取需要补充的高度

/**
     * 获取需要补充的高度
     * @param context
     * @return
     */
    public static int getMiSupplementHeight(Context context) {
        int result = 0;
        //是否是小米系统,不是小米系统则不需要补充高度
        if(MiUtils.isMIUI()) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1
                    && Settings.Global.getInt(context.getContentResolver(), "force_fsg_nav_bar", 0) == 0) {
                //如果虚拟按键已经显示,则不需要补充高度
            } else {
                //如果虚拟按键没有显示,则需要补充虚拟按键高度到屏幕高度
                Resources res = context.getResources();
                int resourceId = res.getIdentifier("navigation_bar_height", "dimen", "android");
                if (resourceId > 0) {
                    result = res.getDimensionPixelSize(resourceId);
                }
            }
        }

        return result;
    }

 

你可能感兴趣的:(android)