Desde PopupWindow
sólo se suma a una View
WindowManager
puede utilizar para actualizar el updateViewLayout (View view, ViewGroup.LayoutParams params)
LayoutParams
de sus PopupWindow
's contentView
después de llamar espectáculo ..().
Establecer el indicador de ventana FLAG_DIM_BEHIND
atenuará todo detrás de la ventana. Use dimAmount
para controlar la cantidad de dim (1.0 para completamente opaco a 0.0 para no dim).
Tenga en cuenta que si establece un fondo en su PopupWindow
, pondrá su contentView
en un contenedor, lo que significa que debe actualizarlo.
Con antecedentes:
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);
Sin fondo:
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 Actualización:
En M PopupWindow envuelve el contentView dentro de un FrameLayout llama mDecorView. Si profundiza en el origen de PopupWindow, encontrará algo como createDecorView(View contentView)
. El objetivo principal de mDecorView es gestionar el envío de eventos y las transiciones de contenido, que son nuevos para M. Esto significa que necesitamos agregar uno más .getParent() para acceder al contenedor .
Con fondo que requeriría un cambio a algo como:
View container = (View) popup.getContentView().getParent().getParent();
mejor alternativa para la API 18+
Una solución menos hacky usando ViewGroupOverlay
:
1) Obtenga la distribución de raíz deseada
ViewGroup root = (ViewGroup) getWindow().getDecorView().getRootView();
2) Llame a applyDim(root, 0.5f);
o 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();
}
Una palabra de advertencia: FLAG_BLUR_BEHIND está libre de errores en algunos teléfonos y hace que el teléfono muy insensibles (al parecer la falta de definición se hace en software). En el Droid, por ejemplo. Aparte de eso, lo que dijo Macarse: FLAG_BLUR_BEHIND debe aplicarse a la ventana en primer plano. – EboMike
posible duplicado de [¿La mejor forma de mostrar un texto de edición sobre la pantalla?] (Http://stackoverflow.com/questions/460418/best-way-to-show-a-edit-text-over -screen) – Pops
Yo soy buscando la misma respuesta a esta pregunta. ¿Hay alguna manera de atenuar programáticamente la vista que se encuentra detrás de la ventana emergente? – Nick