Dal momento che PopupWindow
solo aggiunge un View
per WindowManager
è possibile utilizzare updateViewLayout (View view, ViewGroup.LayoutParams params)
per aggiornare la LayoutParams
dei vostri PopupWindow
's contentView
dopo aver chiamato spettacolo .. ().
L'impostazione della bandiera della finestra FLAG_DIM_BEHIND
oscurerà tutto ciò che si trova dietro la finestra. Utilizzare dimAmount
per controllare la quantità di attenuazione (1.0 per completamente opaco a 0.0 per nessuna attenuazione).
Tieni presente che se imposti uno sfondo al tuo PopupWindow
, il tuo verrà inserito contentView
in un contenitore, il che significa che dovrai aggiornare il suo genitore.
Con sfondo:
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);
Senza sfondo:
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);
Aggiornamento Marshmallow:
Su M PopupWindow avvolge il contentView all'interno di un FrameLayout chiamato mDecorView. Se scavi nella sorgente PopupWindow troverai qualcosa di simile createDecorView(View contentView)
. Lo scopo principale di mDecorView è quello di gestire l'invio di eventi e le transizioni di contenuto, che sono nuove per M. Ciò significa che dobbiamo aggiungere un altro .getParent () per accedere al contenitore.
Con uno sfondo che richiederebbe una modifica a qualcosa come:
View container = (View) popup.getContentView().getParent().getParent();
Migliore alternativa per API 18+
Una soluzione meno hacker che utilizza ViewGroupOverlay
:
1) Procurati il layout radice desiderato
ViewGroup root = (ViewGroup) getWindow().getDecorView().getRootView();
2) Chiama applyDim(root, 0.5f);
oclearDim()
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();
}