参考博客: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);
}
}
}
欢迎个大神扔砖指正