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;