ตั้งแต่ PopupWindow
เพียงแค่เพิ่มView
การWindowManager
ที่คุณสามารถใช้updateViewLayout (View view, ViewGroup.LayoutParams params)
ในการปรับปรุงLayoutParams
ของคุณPopupWindow
's contentView
หลังจากเรียกการแสดง .. ()
การตั้งค่าแฟFLAG_DIM_BEHIND
ล็กหน้าต่างจะทำให้ทุกอย่างมืดลงด้านหลังหน้าต่าง ใช้dimAmount
เพื่อควบคุมปริมาณการหรี่แสง (1.0 สำหรับทึบแสงทั้งหมดถึง 0.0 หากไม่มีแสงสลัว)
โปรดทราบว่าหากคุณตั้งค่าพื้นหลังของคุณPopupWindow
จะเป็นการใส่contentView
ลงในคอนเทนเนอร์ซึ่งหมายความว่าคุณต้องอัปเดตเป็นระดับบนสุด
พร้อมพื้นหลัง:
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();
// add flag
p.flags |= WindowManager.LayoutParams.FLAG_DIM_BEHIND;
p.dimAmount = 0.3f;
wm.updateViewLayout(container, p);
ไม่มีพื้นหลัง:
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();
// add flag
p.flags |= WindowManager.LayoutParams.FLAG_DIM_BEHIND;
p.dimAmount = 0.3f;
wm.updateViewLayout(contentView, p);
อัพเดต Marshmallow:
บน M PopupWindow จะรวม contentView ไว้ใน FrameLayout ที่เรียกว่า mDecorView หากคุณขุดลงไปในแหล่งที่มา PopupWindow คุณจะพบสิ่งที่ต้องการcreateDecorView(View contentView)
จุดประสงค์หลักของ mDecorView คือจัดการการจัดส่งเหตุการณ์และการเปลี่ยนเนื้อหาซึ่งเป็นสิ่งใหม่สำหรับ M ซึ่งหมายความว่าเราต้องเพิ่ม. getParent () อีกหนึ่งรายการเพื่อเข้าถึงคอนเทนเนอร์
ด้วยพื้นหลังที่จะต้องมีการเปลี่ยนแปลงสิ่งที่ต้องการ:
View container = (View) popup.getContentView().getParent().getParent();
ทางเลือกที่ดีกว่าสำหรับ API 18+
โซลูชันที่แฮ็กน้อยโดยใช้ ViewGroupOverlay
:
1) รับเค้าโครงรูทที่ต้องการ
ViewGroup root = (ViewGroup) getWindow().getDecorView().getRootView();
2) โทรapplyDim(root, 0.5f);
หรือclearDim()
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();
}