在這次項(xiàng)目需要用到PopupWindow嘱丢,但發(fā)現(xiàn)如果你用showAsDropDown()這個(gè)方法,讓pop顯示在某個(gè)View的下面祠饺,而且pop的高度是match_parent的話越驻,其顯示的位置在Android7.0以下系統(tǒng)正常,在7.0和7.1系統(tǒng)顯示不正常,點(diǎn)擊“打開POP”按鈕效果對(duì)比如下:
error.png
normal.png
相信大家都已經(jīng)看到問題所在了吧缀旁,我希望在點(diǎn)擊篩選的時(shí)候记劈,讓他顯示在篩選的下面,結(jié)果他把整個(gè)窗體都給覆蓋了并巍。
原因分析請(qǐng)參考如下文章目木,目前估計(jì)是Google的問題,好像在7.1已經(jīng)修復(fù)了
PopupWindow 在 Android N(7.0) 的兼容性問題
解決方案一
我在24版本使用showAtLocation(View parent, int gravity, int x, int y)懊渡。其中parent只要為當(dāng)前頁(yè)面的view即可刽射,gravity用Gravity.NO_GRAVITY,x,y為你要顯示的位置距贷。如果要顯示在某個(gè)view的下面柄冲,就獲取該view的坐標(biāo)就好吻谋。
if (Build.VERSION.SDK_INT >= 24) {
//7.0以上系統(tǒng)
//獲取目標(biāo)控件在屏幕中的坐標(biāo)位置
int[] location = new int[2];
anchor.getLocationOnScreen(location);
mPopupWindow.showAtLocation(anchor, Gravity.NO_GRAVITY, 0, location[1] );
} else {
mPopupWindow.showAsDropDown(anchor);
}
方法二
重寫popWindows的showAsDropDown方法
public class CustomPopupWindowextends PopupWindow {
public CustomPopupWindow(Context context) {
super(context, null);
}
@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);
}
}