Da PopupWindownur ein fügt Viewzu WindowManagerkönnen Sie mit updateViewLayout (View view, ViewGroup.LayoutParams params)der Aktualisierung LayoutParamsIhrer PopupWindow‚s contentViewAfter - Show - Aufruf .. ().
Durch Setzen der Fensterflagge FLAG_DIM_BEHINDwird alles hinter dem Fenster abgeblendet. Verwenden Sie dimAmountdiese Option , um die Menge an Dim zu steuern (1,0 für vollständig undurchsichtig bis 0,0 für No Dim).
Denken Sie daran, dass wenn Sie einen Hintergrund für Ihren festlegen, PopupWindowdieser contentViewin einen Container verschoben wird, was bedeutet, dass Sie dessen übergeordnetes Element aktualisieren müssen.
Mit Hintergrund:
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);
Ohne Hintergrund:
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 Update:
In M PopupWindow wird die Inhaltsansicht in ein FrameLayout mit dem Namen mDecorView eingeschlossen. Wenn Sie sich in die PopupWindow-Quelle vertiefen, finden Sie so etwas wie. createDecorView(View contentView)Der Hauptzweck von mDecorView besteht darin, Ereignisversand und Inhaltsübergänge zu verarbeiten, die für M neu sind. Dies bedeutet, dass wir eine weitere .getParent () hinzufügen müssen, um auf den Container zuzugreifen.
Mit Hintergrund, der eine Änderung an etwas erfordern würde wie:
View container = (View) popup.getContentView().getParent().getParent();
Bessere Alternative für API 18+
Eine weniger hackige Lösung mit ViewGroupOverlay:
1) Holen Sie sich das gewünschte Root-Layout
ViewGroup root = (ViewGroup) getWindow().getDecorView().getRootView();
2) Rufen Sie an applyDim(root, 0.5f);oderclearDim()
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();
}