1. 問題描述
PopupWindow 中的 showAsDropDown(View anchor) 用于在指定錨點View下方顯示 PopupWindow,在Android 7.0 (api<=23) 以前是沒什么問題的,但是在Android 7.x系統上,會在某些情況下出現兼容問題:
如果指定 PopupWindow 的高度為 MATCH_PARENT,調用 showAsDropDown(View anchor) 時,在 7.0 之前,會在錨點 anchor 下邊緣到屏幕底部之間顯示 PopupWindow;而在 7.0、7.1 系統上的 PopupWindow 會占據整個屏幕(除狀態欄之外)。(SDK >= 24時,PopupWindow高度為 match_parent 時,會占據整個屏幕,需要重新設置。)
如果指定 PopupWindow 的高度為 WRAP_CONTENT, 調用 showAsDropDown(View anchor) 時,便不會出現兼容性的問題。
如果指定 PopupWindow 的高度為自定義的值height,調用 showAsDropDown(View anchor)時, 如果 height > 錨點 anchor 下邊緣與屏幕底部的距離, 則還是會出現7.0、7.1上顯示異常的問題;否則,不會出現該問題。可以看出,情況1和2是情況3的特例。
解決方案
參考:http://tianma.pro/post/1634332613/
如果出現上述分析中的兼容性問題,可以使用 showAtLocation() 方法替代 showAsDropDown() , 示例代碼如下。
2. 問題描述
首次進入頁面,在指定位置彈出提示語。
處理方案:使用popupwindow展示,設置offX、offY達到指定位置。
出現問題:不用分辨率手機,位置不同。
小屏手機起始位置:
小屏手機設置offX = DensityUtil.dip2px(36)。
大屏手機起始位置:
大屏手機設置offX = DensityUtil.dip2px(36)。
問題分析
設置offX后,其移動的距離,在“百寶箱”之外是符合屏幕適配的【紅色箭頭的位置,在“家”下面】,而在“百寶箱”內部是不符合的。而百寶箱內部使用recyclerview均分布局。
問題1:背景圖.9.png
箭頭兩端都能拉伸,不能確定箭頭的位置。
問題2:平分布局
平分布局View中的元素,與其他View中的元素,位置關系不再保持一致,會隨著屏幕分辨率而變化。(1080-30dp)/ 4
解決方案
UI提供箭頭距離確定的.9圖,并且固定popupwindow的寬度,通過計算得出offX
注意事項:popupwindow的高寬不能在XML中進行設置,因為會被覆蓋。
View.inflate(getContext(), R.layout.host_house_can_see_time_pop_rent, null);
//高寬值無效,因為指定沒有父布局
new PopupWindow(view, DensityUtil.dip2px(264), LinearLayout.LayoutParams.WRAP_CONTENT); // 生效