1. 程式人生 > >Popupwindow在Android7.0顯示位置解決方案

Popupwindow在Android7.0顯示位置解決方案

寫在前面的話:這是自己第一次寫部落格,也是第一次記錄自己在開發中遇到的問題,文中難免有疏漏的知識點,望大家批評指正,共同進步;

在近期專案開發中,遇到了PopupWindow在Android7.0的手機上顯示位置不正確的問題,當時也是在網上找了些許方案,結合自己專案中的實際應用,終於解決了這個問題,在這裡記錄一下自己的解決方案,希望可以幫助到有此問題的小夥伴。

在我的頁面中有一個搜尋框和PopupWindow,當點選搜尋框軟體盤彈出,之後點選PopupWindow彈出,發現PopupWindow彈出位置竟然直接頂到了上面,如下圖

在網上找了大神們的各種方案,在這裡我順便把幾種解決方案都貼出來,方便檢視:

第一種:

if(Build.VERSION.SDK_INT == 24) {
            Rect rect = new Rect();
            anchor.getGlobalVisibleRect(rect);
            int h = anchor.getResources().getDisplayMetrics().heightPixels - rect.bottom;

            setHeight(h);

            mPopupWindow.showAsDropDown(view, 0, 0);

        }

這種方法在軟鍵盤不彈出的情況下是好用,但是軟鍵盤彈出後再點選popupwindow還是會出現訂到上面的問題

第二種:

 if(android.os.Build.VERSION.SDK_INT>android.os.Build.VERSION_CODES.M) {

   int[] location = new int[2];    

  viewMark.getLocationOnScreen(location);

   int y = location[1] ;
   pop.showAtLocation(viewMark, Gravity.NO_GRAVITY,0,y);
}else {
  pop.showAsDropDown(viewMark);

 }

這種方法也會出現第一種的問題,需要在show方法之後加上pop.update這句話,官網給出的原始碼是這樣的:

Updates the state of the popup window, if it is currently being displayed,from the currently set state.

大概意思就是更新PopupWindow狀態,如果當前已是顯示狀態,就從當前狀態更新。 

這樣就可以解決了我當前遇到的問題,需要注意的是y的偏移量需要根據當前佈局來定義,在這裡我用的是y+view.getHeight

最終的效果為:


至此我遇到的問題就解決了;大家如果還遇到別的問題可以一起探討;

後記!!!!!!

在後期測試中發現第二種方法在7.1以上的機型上依然會出現這樣的問題,所以呢,下面這一種方法誕生了(目前在7.1以上的機型測試暫沒發現問題):

        /*
         * 此方法針對7.0部分機型PopupWindow彈出位置不正確的解決方法
         */
        if (mPopupWindow != null && mPopupWindow.isShowing()) {
            mPopupWindow.dismiss();
        } else {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                int[] location = new int[2];
                view.getLocationOnScreen(location);
                int tempHeight = mPopupWindow.getHeight();
                if (tempHeight == WindowManager.LayoutParams.MATCH_PARENT || ScreenUtils.getScreenHeight(context) <=
                        tempHeight) {
                    mPopupWindow.setHeight(ScreenUtils.getScreenHeight(context) - location[1] - view.getHeight());
                }
                mPopupWindow.showAtLocation(view, Gravity.NO_GRAVITY, location[0], location[1] + view.getHeight());
                mPopupWindow.update();
            } else {
                if (mPopupWindow != null) {
                    mPopupWindow.showAsDropDown(view, 0, 0);
                    mPopupWindow.update();
                }
            }
        }

這段程式碼為獲取絕對座標,在這裡我用的是獲取整個螢幕內的絕對座標

int[] location = new int[2] ;
view.getLocationInWindow(location); //獲取在當前視窗內的絕對座標
view.getLocationOnScreen(location);//獲取在整個螢幕內的絕對座標
location [0]--->x座標,location [1]--->y座標

獲取popupwindow的高度

int tempHeight = mPopupWindow.getHeight();

之後要和螢幕的高度進行對比 ,如果是鋪滿螢幕或者和螢幕高度相等或者大於螢幕高度,此時需要設定popupwindow的高度,即用螢幕高度減去y軸座標減去view的高度(我這裡的view為彈出框在哪個view下顯示彈出的view,不知道這麼說能看懂嗎偷笑),此時的高度就是popupwindow的高度。

之後再呼叫顯示方法即可!

mPopupWindow.showAtLocation(view, Gravity.NO_GRAVITY, location[0], location[1] + view.getHeight());

x軸引數為location[0],y軸座標為location[1]+view.getHeight;