版權(quán)聲明:本文源自簡(jiǎn)書tianma硫朦,轉(zhuǎn)載請(qǐng)務(wù)必注明出處: http://www.reibang.com/p/e4778c185dc9
問題描述
PopupWindow 中的 showAsDropDown(View anchor) 用于在指定錨點(diǎn)View下方顯示 PopupWindow,在Android 7.0 (api<=23) 以前是沒什么問題的咬展,但是在Android 7.x系統(tǒng)上泽裳,會(huì)在某些情況下出現(xiàn)兼容問題:
如果指定 PopupWindow 的高度為 MATCH_PARENT破婆,調(diào)用 showAsDropDown(View anchor) 時(shí)诡壁,在 7.0 之前荠割,會(huì)在錨點(diǎn) anchor 下邊緣到屏幕底部之間顯示 PopupWindow;而在 7.0旺矾、7.1 系統(tǒng)上的 PopupWindow 會(huì)占據(jù)整個(gè)屏幕(除狀態(tài)欄之外)。
如果指定 PopupWindow 的高度為 WRAP_CONTENT, 調(diào)用 showAsDropDown(View anchor) 時(shí)箕宙,便不會(huì)出現(xiàn)兼容性的問題嚎朽。
如果指定 PopupWindow 的高度為自定義的值height柬帕,調(diào)用 showAsDropDown(View anchor)時(shí)哟忍, 如果 height > 錨點(diǎn) anchor 下邊緣與屏幕底部的距離, 則還是會(huì)出現(xiàn)7.0锅很、7.1上顯示異常的問題其馏;否則爆安,不會(huì)出現(xiàn)該問題叛复。可以看出扔仓,情況1和2是情況3的特例。
解決方案
如果出現(xiàn)上述分析中的兼容性問題翘簇,可以使用 showAtLocation() 方法替代 showAsDropDown() , 示例代碼如下撬码,詳情可參見 PopupWindowCompatSample
if (Build.VERSION.SDK_INT >= 24) { // Android 7.x中,PopupWindow高度為match_parent時(shí),會(huì)出現(xiàn)兼容性問題,需要處理兼容性
int[] location = new int[2]; // 記錄anchor在屏幕中的位置
anchor.getLocationOnScreen(location);
int offsetY = location[1] + anchor.getHeight();
if (Build.VERSION.SDK_INT == 25) { // Android 7.1中版保,PopupWindow高度為 match_parent 時(shí)呜笑,會(huì)占據(jù)整個(gè)屏幕
// 故而需要在 Android 7.1上再做特殊處理
int screenHeight = ScreenUtils.getScreenHeight(context); // 獲取屏幕高度
popupWindow.setHeight(screenHeight - offsetY); // 重新設(shè)置 PopupWindow 的高度
}
popupWindow.showAtLocation(anchor, Gravity.NO_GRAVITY, 0, offsetY);
} else {
popupWindow.showAsDropDown(anchor);
}