Android 7.0以上(包含8.0), popupWindow彈窗位置異常, 解決方案
阿新 • • 發佈:2019-01-07
通常我們的App中, 在標題的位置, 點選需要彈出選單, 效果如下:
這很難嗎? 拿起鍵盤就是幹…
public void showAsDropDown(View anchor, int xoff, int yoff) {
showAsDropDown(anchor, xoff, yoff, DEFAULT_ANCHORED_GRAVITY);
}
但是往往並不是我們想的那樣, 至今Android7.0,以上包括(7.1, 8.0) 系統的手機彈窗, 根本不按套路出牌, 以致我們相同的程式碼, 卻有不同的效果.
喂! 我的標題欄呢??? 被你吃啦???
趕緊給我吐出來!!!
這能難倒我? 瀏覽器開啟> 百度開啟> xxx不能正常顯示
嗖嗖嗖…
你可能看到這樣的程式碼
if (Build.VERSION.SDK_INT >= 24) {
int[] location = new int[2];
anchor.getLocationOnScreen(location);
// 7.1 版本處理
if (Build.VERSION.SDK_INT == 25) {
WindowManager windowManager = (WindowManager) pw.getContentView ().getContext().getSystemService(Context.WINDOW_SERVICE);
if (windowManager != null) {
int screenHeight = windowManager.getDefaultDisplay().getHeight();
// PopupWindow height for match_parent, will occupy the entire screen, it needs to do special treatment in Android 7.1
pw.setHeight(screenHeight - location[1] - anchor.getHeight() - yoff);
}
}
pw.showAtLocation(anchor, Gravity.NO_GRAVITY, xoff, location[1] + anchor.getHeight() + yoff);
} else {
pw.showAsDropDown(anchor, xoff, yoff);
}
試試效果, 還真行.
如果你到這裡就關掉網頁的話, 那我只能說, bug還在向你招手呢? 是不是想讓測試MM找你呢? 難道是…(邪惡..)
Android8.0系統, 這樣的方式並不能解決,.
終極解決方案(7.0, 7.1, 8.0)
/**
*
* @param pw popupWindow
* @param anchor v
* @param xoff x軸偏移
* @param yoff y軸偏移
*/
public static void showAsDropDown(final PopupWindow pw, final View anchor, final int xoff, final int yoff) {
if (Build.VERSION.SDK_INT >= 24) {
Rect visibleFrame = new Rect();
anchor.getGlobalVisibleRect(visibleFrame);
int height = anchor.getResources().getDisplayMetrics().heightPixels - visibleFrame.bottom;
pw.setHeight(height);
pw.showAsDropDown(anchor, xoff, yoff);
} else {
pw.showAsDropDown(anchor, xoff, yoff);
}
}