Dal momento che PopupWindowsolo aggiunge un Viewper WindowManagerè possibile utilizzare updateViewLayout (View view, ViewGroup.LayoutParams params)per aggiornare la LayoutParamsdei vostri PopupWindow's contentViewdopo aver chiamato spettacolo .. ().
L'impostazione della bandiera della finestra FLAG_DIM_BEHINDoscurerà tutto ciò che si trova dietro la finestra. Utilizzare dimAmountper 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 contentViewin 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();
}