我們自定義popupWindow的時候,一般會設置這些參數
setContentView(contentView);
//設置高度為屏幕高度 setWidth(UIUtils.getScreenHeight(context)); //設置寬度為屏幕寬度 setHeight(UIUtils.getScreenWidth(context)); setFocusable(true); //dismiss時將背景透明度恢復為1f setOnDismissListener(()-> modifyActivityAlpha(1f)); setBackgroundDrawable(new BitmapDrawable()); setAnimationStyle(R.style.action_sheet_no_animation); //將透明度alpha值設為0.5f modifyActivityAlpha(0.5f); //在底部展示 showAtLocation(context.getWindow().getDecorView(), Gravity.BOTTOM, 0, 0);
//改變背景透明度 private void modifyActivityAlpha(float alpha) { WindowManager.LayoutParams params = context.getWindow().getAttributes(); params.alpha = alpha; context.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND); context.getWindow().setAttributes(params); }
關於獲取屏幕的寬高可以查看我的這篇文章:https://www.jianshu.com/p/cbba19018f5d
在魅族的手機(沒有底部導航欄)上很開心很愉快的運行着,但是當我看到華為手機(有底部虛擬按鈕)的顯示結果時我是很頭疼的,popupWindow有一部分布局被虛擬按鈕遮擋了。
圖一(可以看到底部滑不上去,一部分被遮擋了。)

one.png
- 在經過一番google后發現大家一致推薦的解決方案,在參數設置中加上
setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
- 滿懷期待的等待着運行的結果,但是發現並沒有解決問題,我開始思考哪里出問題了。
后來發現是寬高設置的問題,我把寬高的設置改為:
setWidth(WindowManager.LayoutParams.MATCH_PARENT); setHeight(WindowManager.LayoutParams.MATCH_PARENT);
- 因為之前設置的是屏幕的寬高,是把虛擬按鍵的高度算在內的。
- 終於解決了有虛擬按鍵時全屏的popupWindow出現的遮擋問題。
圖二(問題解決)

image.png
下面是最終的部分代碼
public void init(View contentView, View layoutContent) { setContentView(contentView); setWidth(WindowManager.LayoutParams.MATCH_PARENT); setHeight(WindowManager.LayoutParams.MATCH_PARENT); setFocusable(true); setOnDismissListener(()-> modifyActivityAlpha(1f)); setBackgroundDrawable(new BitmapDrawable()); setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE); setAnimationStyle(R.style.action_sheet_no_animation); modifyActivityAlpha(0.5f); showAtLocation(context.getWindow().getDecorView(), Gravity.BOTTOM, 0, 0); }
補充:在測試中僅僅使用了6.0的手機,有博主指出在7.0以上手機上會出現無效的問題,大家可以參考:http://blog.csdn.net/qinyunying/article/details/55051193。
如果解決了你的問題,希望能給個👍哦。