Android-PopupWindow的showAsDropDown适配全面屏手机

PopupWindow显示在某个控件的下方showAsDropDown(view),适配7.0版本及以上通常是通过以下方式:

        /**
         * 适配Android7.0
         */
        @Override
        public void showAsDropDown(View anchor) {
            if (Build.VERSION.SDK_INT >= 24) {
                Rect rect = new Rect();
                anchor.getGlobalVisibleRect(rect);
                int h = anchor.getResources().getDisplayMetrics().heightPixels - rect.bottom;
                setHeight(h);
            }
            super.showAsDropDown(anchor);
        }

但是在全面屏手机上却出出现一个问题:popupWindow不能全屏显示。

此时就需要单独兼容 全面屏手机。

 首先要了解一下全面屏手机与一般手机在获取屏幕高度的区别,以下三种方式:

方式1:

DisplayMetrics dm = new DisplayMetrics();
activity.getWindowManager().getDefaultDisplay().getRealMetrics(dm);
int screenHeight1 = dm.heightPixels;

方式2:

WindowManager wm = (WindowManager) activity.getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics outMetrics = new DisplayMetrics();
wm.getDefaultDisplay().getMetrics(outMetrics);
int screenHeight2 = outMetrics.heightPixels;

方式3:

int screenHeight3 = anchor.getResources().getDisplayMetrics().heightPixels;

一般手机三种方式打印的结果是:

screenHeight1 = 1960;
screenHeight2 = 1960;
screenHeight3 = 1960; 

全面屏手机打印的结果是:

screenHeight1 = 2400;
screenHeight2 = 2198;
screenHeight3 = 2198; 

对比会发现手机屏幕高度获取出现了差异,通过打印全面屏手机的状态栏高度和底部功能键栏的高度:

StatusBarHeight = 88;

NavigationBarHeight = 114;

对比发现,原来全面屏手机的方法二和方法三获取的高度去掉了状态栏和底部功能键栏高度,这就找到了解决方式:通过方法一,然后去掉底部功能键栏高度;

        /**
         * 适配Android7.0
         */
        @Override
        public void showAsDropDown(View anchor) {
            if (Build.VERSION.SDK_INT >= 24) {
                Rect rect = new Rect();
                anchor.getGlobalVisibleRect(rect);

                DisplayMetrics dm = new DisplayMetrics();
                activity.getWindowManager().getDefaultDisplay().getRealMetrics(dm);
                int screenHeight = dm.heightPixels;
                int h = screenHeight - rect.bottom - ImmersionBar.getNavigationBarHeight(activity);
                setHeight(h);
            }
            super.showAsDropDown(anchor);
        }

完美解决了全面屏手机适配问题。

ImmersionBar.getNavigationBarHeight(activity) 引用的

'com.gyf.immersionbar:immersionbar-components:3.0.0'

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值