AlertDialog底部彈出並橫向鋪滿屏幕

當我們彈出一個AlertDialog時,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底部彈出,並且橫向鋪滿屏幕寬度
在這裏插入圖片描述

發佈了27 篇原創文章 · 獲贊 3 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章