參考博客:http://blog.csdn.net/zhihui_520/article/details/79097161
之前在沒有適配Android sdk 7.0 的時(shí)候PopWindow 用來顯示下拉框 顯示阻斷提示 感覺比自定義的Dialog/DialogFragment 簡單粗暴多了
后來7.0出來后我大愛的PopWidow 顯示竟然錯(cuò)位了 what?沒辦法只能上萬能度一陣狂搜后來才知道這是PopWindow在Android7.0上的一個(gè)小小的bug航背、、旭旭、一萬個(gè)草泥飛奔而過
之前適配解決辦法:
在Sdk大于等于24 的時(shí)候先傳入觸發(fā)PopWidnow顯示的View獲取該View的絕對位置然后調(diào)用PopWindow的 showAtLocation方法把顯示偏移值給加上 然后就大功告成了(Andorid 的坐標(biāo)系是左上角 [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大大已經(jīng)修復(fù)了這個(gè)Bug (吐槽:臥槽修改為啥不修改好!!!,大神也會(huì)犯錯(cuò)嗯淡定淡定)
現(xiàn)在的解決方案
其實(shí)就是獲取觸發(fā)點(diǎn)的絕對位置 讓屏幕的height減去觸發(fā)點(diǎn)的底部距離 然后重新給PopWidnow 設(shè)置高度顯示(純屬個(gè)人理解)
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);
}
}
}
歡迎個(gè)大神扔磚指正