Android7.0顯示 PopupWindow位置錯(cuò)誤

在這次項(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)前頁面的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);  
    }  
}  
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容