1. 問題描述
PopupWindow 中的 showAsDropDown(View anchor) 用于在指定錨點View下方顯示 PopupWindow吕粗,在Android 7.0 (api<=23) 以前是沒什么問題的献雅,但是在Android 7.x系統(tǒng)上,會在某些情況下出現(xiàn)兼容問題:
如果指定 PopupWindow 的高度為 MATCH_PARENT咐容,調(diào)用 showAsDropDown(View anchor) 時森篷,在 7.0 之前欢揖,會在錨點 anchor 下邊緣到屏幕底部之間顯示 PopupWindow;而在 7.0犯戏、7.1 系統(tǒng)上的 PopupWindow 會占據(jù)整個屏幕(除狀態(tài)欄之外)。(SDK >= 24時拳话,PopupWindow高度為 match_parent 時先匪,會占據(jù)整個屏幕,需要重新設(shè)置假颇。)
如果指定 PopupWindow 的高度為 WRAP_CONTENT, 調(diào)用 showAsDropDown(View anchor) 時胚鸯,便不會出現(xiàn)兼容性的問題。
如果指定 PopupWindow 的高度為自定義的值height笨鸡,調(diào)用 showAsDropDown(View anchor)時姜钳, 如果 height > 錨點 anchor 下邊緣與屏幕底部的距離坦冠, 則還是會出現(xiàn)7.0、7.1上顯示異常的問題哥桥;否則辙浑,不會出現(xiàn)該問題∧飧猓可以看出判呕,情況1和2是情況3的特例。
解決方案
參考:http://tianma.pro/post/1634332613/
如果出現(xiàn)上述分析中的兼容性問題送滞,可以使用 showAtLocation() 方法替代 showAsDropDown() , 示例代碼如下侠草。
2. 問題描述
首次進入頁面,在指定位置彈出提示語犁嗅。
處理方案:使用popupwindow展示边涕,設(shè)置offX、offY達到指定位置褂微。
出現(xiàn)問題:不用分辨率手機功蜓,位置不同。
小屏手機起始位置:
小屏手機設(shè)置offX = DensityUtil.dip2px(36)宠蚂。
大屏手機起始位置:
大屏手機設(shè)置offX = DensityUtil.dip2px(36)式撼。
問題分析
設(shè)置offX后,其移動的距離求厕,在“百寶箱”之外是符合屏幕適配的【紅色箭頭的位置著隆,在“家”下面】,而在“百寶箱”內(nèi)部是不符合的甘改。而百寶箱內(nèi)部使用recyclerview均分布局旅东。
問題1:背景圖.9.png
箭頭兩端都能拉伸,不能確定箭頭的位置十艾。
問題2:平分布局
平分布局View中的元素,與其他View中的元素腾节,位置關(guān)系不再保持一致忘嫉,會隨著屏幕分辨率而變化。(1080-30dp)/ 4
解決方案
UI提供箭頭距離確定的.9圖案腺,并且固定popupwindow的寬度庆冕,通過計算得出offX
注意事項:popupwindow的高寬不能在XML中進行設(shè)置,因為會被覆蓋劈榨。
View.inflate(getContext(), R.layout.host_house_can_see_time_pop_rent, null);
//高寬值無效访递,因為指定沒有父布局
new PopupWindow(view, DensityUtil.dip2px(264), LinearLayout.LayoutParams.WRAP_CONTENT); // 生效