Android PopWindow 在sdk>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);
        }
    }
}

欢迎个大神扔砖指正

    原文作者:MrZang
    原文地址: https://www.jianshu.com/p/bbef17233ad8
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞