Kể từ khi PopupWindow
chỉ cần thêm một View
để WindowManager
bạn có thể sử dụng updateViewLayout (View view, ViewGroup.LayoutParams params)
để cập nhật các LayoutParams
của bạn PopupWindow
'scontentView
sau khi gọi chương trình .. ().
Đặt cờ cửa sổ FLAG_DIM_BEHIND
sẽ làm mờ mọi thứ phía sau cửa sổ. Sử dụng dimAmount
để kiểm soát lượng mờ (1,0 cho mờ hoàn toàn đến 0,0 cho không mờ).
Hãy nhớ rằng nếu bạn đặt nền cho nền, PopupWindow
nó sẽ đưa bạn contentView
vào một vùng chứa, có nghĩa là bạn cần cập nhật nền đó.
Với nền:
PopupWindow popup = new PopupWindow(contentView, width, height);
popup.setBackgroundDrawable(background);
popup.showAsDropDown(anchor);
View container = (View) popup.getContentView().getParent();
WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
WindowManager.LayoutParams p = (WindowManager.LayoutParams) container.getLayoutParams();
p.flags |= WindowManager.LayoutParams.FLAG_DIM_BEHIND;
p.dimAmount = 0.3f;
wm.updateViewLayout(container, p);
Không có nền:
PopupWindow popup = new PopupWindow(contentView, width, height);
popup.setBackgroundDrawable(null);
popup.showAsDropDown(anchor);
WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
WindowManager.LayoutParams p = (WindowManager.LayoutParams) contentView.getLayoutParams();
p.flags |= WindowManager.LayoutParams.FLAG_DIM_BEHIND;
p.dimAmount = 0.3f;
wm.updateViewLayout(contentView, p);
Cập nhật Marshmallow:
Trên M PopupWindow bao bọc contentView bên trong FrameLayout được gọi là mDecorView. Nếu bạn tìm hiểu kỹ nguồn PopupWindow, bạn sẽ thấy một cái gì đó nhưcreateDecorView(View contentView)
.
Với nền sẽ yêu cầu thay đổi một cái gì đó như:
View container = (View) popup.getContentView().getParent().getParent();
Thay thế tốt hơn cho API 18+
Một giải pháp ít hack hơn bằng cách sử dụng ViewGroupOverlay
:
1) Nắm giữ bố cục gốc mong muốn
ViewGroup root = (ViewGroup) getWindow().getDecorView().getRootView();
2) Gọi applyDim(root, 0.5f);
hoặcclearDim()
public static void applyDim(@NonNull ViewGroup parent, float dimAmount){
Drawable dim = new ColorDrawable(Color.BLACK);
dim.setBounds(0, 0, parent.getWidth(), parent.getHeight());
dim.setAlpha((int) (255 * dimAmount));
ViewGroupOverlay overlay = parent.getOverlay();
overlay.add(dim);
}
public static void clearDim(@NonNull ViewGroup parent) {
ViewGroupOverlay overlay = parent.getOverlay();
overlay.clear();
}