當我們彈出一個AlertDialog時,AlertDialog提示框通常表現爲懸浮在一個頁面上,周圍都是帶黑色透明度的遮板。
AlertDialog.Builder builder =
new AlertDialog.Builder(MainActivity.this);
View dialogView = LayoutInflater.from(MainActivity.this).inflate(R.layout.layout_dialog,
null);
builder.setView(dialogView);
AlertDialog alertDialog = builder.create();
alertDialog.show();
那麼如何讓一個AlertDialog展示效果類似PopupWindon用於彈出分享選擇框的效果——Dialog底部彈出,並且橫向鋪滿頁面。
首先爲了讓Dialog在底部顯示,需要獲取Dialog的Window對象,然後將Window對象屬性設置爲Bottom
// 設置對話框的位置偏下
Window window = alertDialog.getWindow();
WindowManager.LayoutParams wlp = window.getAttributes();
wlp.gravity = Gravity.BOTTOM;
window.setAttributes(wlp);
可以看到效果,AlertDialog已經在頁面底部彈出,在AlertDialog的橫向還有底部都有空隙,並沒有完全鋪滿這些空隙
嘗試獲取屏幕寬度,將屏幕寬度設置爲window的寬
Window window = alertDialog.getWindow();
WindowManager.LayoutParams wlp = window.getAttributes();
wlp.gravity = Gravity.BOTTOM;
WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
Display display = wm.getDefaultDisplay();
wlp.width = display.getWidth();
window.setAttributes(wlp);
AlertDialog展示效果並沒有達到預期,並沒有鋪滿屏幕寬度
然後我們在Android源碼裏看到AlertDialog默認樣式中,設置了一個背景圖片
進入到abc_dialog_material_background對應的drawable,這裏使用了InsetDrawable作爲AlertDialog背景圖片,效果和padding差不多,相當於padding了16dp的距離,導致了AlertDialog無法橫向鋪滿屏幕
找到了問題的原因,我們只要重設background就能是AlertDialog鋪滿橫屏了
AlertDialog.Builder builder =
new AlertDialog.Builder(MainActivity.this);
View dialogView = LayoutInflater.from(MainActivity.this).inflate(R.layout.layout_dialog,
null);
builder.setView(dialogView);
AlertDialog alertDialog = builder.create();
alertDialog.show();
// 設置對話框的位置偏下
Window window = alertDialog.getWindow();
window.setBackgroundDrawable(null); // 重設background
WindowManager.LayoutParams wlp = window.getAttributes();
wlp.gravity = Gravity.BOTTOM;
WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
Display display = wm.getDefaultDisplay();
wlp.width = display.getWidth();
window.setAttributes(wlp);
最終效果已達預期,AlertDialog底部彈出,並且橫向鋪滿屏幕寬度