Android PopWindow 在7.0以上显示错位的bug适配

参考博客:http://blog.csdn.net/zhihui_520/article/details/79097161

之前在没有适配Android sdk 7.0 的时候PopWindow 用来显示下拉框 显示阻断提示 感觉比自定义的Dialog/DialogFragment 简单粗暴多了
后来7.0出来后我大爱的PopWidow 显示竟然错位了 what?没办法只能上万能度一阵狂搜后来才知道这是PopWindow在Android7.0上的一个小小的bug、、、一万个草泥飞奔而过

之前适配解决办法:

在Sdk大于等于24 的时候先传入触发PopWidnow显示的View获取该View的绝对位置然后调用PopWindow的 showAtLocation方法把显示偏移值给加上 然后就大功告成了(Andorid 的坐标系是左上角 [0,0])

    public void showPopuWindow(View v) {
        if (popupWindow != null && popupWindow.isShowing()) {
            popupWindow.dismiss();
            return;
        } else {
            if (Build.VERSION.SDK_INT >= 24) {
                int[] a = new int[2];
                v.getLocationInWindow(a);
                popupWindow.showAtLocation(v, Gravity.NO_GRAVITY, 0, v.getHeight() + a[1]);
            } else {
                popupWindow.showAsDropDown(v, 0, 0);
            }
        }
}

本以为大功告成了 后来在7.1上跑了一下 what? 老纸不是适配了么没办法那就在改吧 后来翻了大神的博客才知道原来Android7.1以上 Google大大已经修复了这个Bug (吐槽:卧槽修改为啥不修改好!!!,大神也会犯错嗯淡定淡定)

现在的解决方案

其实就是获取触发点的绝对位置 让屏幕的height减去触发点的底部距离 然后重新给PopWidnow 设置高度显示(纯属个人理解)

public void showAsDropDown(View anchor, int xoff, int yoff) {
    if (popupWindow != null && popupWindow.isShowing()) {
        popupWindow.dismiss();
        return;
    } else {
        if (Build.VERSION.SDK_INT >= 24) {
            Rect visibleFrame = new Rect();
            anchor.getGlobalVisibleRect(visibleFrame);
            int height = anchor.getResources().getDisplayMetrics().heightPixels - visibleFrame.bottom;
            popupWindow.setHeight(height);
            popupWindow.showAsDropDown(anchor, xoff, yoff);
        } else {
            popupWindow.showAsDropDown(anchor, xoff, yoff);
        }
    }
}

欢迎个大神扔砖指正

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值