Da PopupWindow
nur ein fügt View
zu WindowManager
können Sie mit updateViewLayout (View view, ViewGroup.LayoutParams params)
der Aktualisierung LayoutParams
Ihrer PopupWindow
‚s contentView
After - Show - Aufruf .. ().
Durch Setzen der Fensterflagge FLAG_DIM_BEHIND
wird alles hinter dem Fenster abgeblendet. Verwenden Sie dimAmount
diese 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, PopupWindow
dieser contentView
in 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();
}