2011-05-19 19 views
28

Tengo algunos pop-ups en mi aplicación, es de pantalla completa y el código siguiente:Mostrar un PopupWindow centralizado

content.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, 
      LayoutParams.WRAP_CONTENT)); 
    content.measure(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 
    int screenWidth = windowManager.getDefaultDisplay().getWidth(); 
    int screenHeight = windowManager.getDefaultDisplay().getHeight(); 
    int x = screenWidth/2 - content.getMeasuredWidth()/2; 
    int y = screenHeight/2 - content.getMeasuredHeight()/2; 
    window.showAtLocation(content, Gravity.NO_GRAVITY, x, y); 

hacer el espectáculo ventana centrada.

Pero tengo otra actividad que no es a pantalla completa, cuando la ventana emergente se abre, desde donde debe estar.

Tratando de descubrir por qué sucede esto, creo que showAtLocation muestra que es relativo a la Actividad actual, pero tengo que mostrarlo en relación con la pantalla.

¿Cómo puedo hacer eso? ¿O hay una manera más simple de simplemente emergente centrado?

Respuesta

84
popupWindow.showAtLocation(anyViewOnlyNeededForWindowToken, Gravity.CENTER, 0, 0); 

Esto centrará su punto de vista.

Me tomó 2 horas de dolor resolver esto. No necesitaba ninguna matemática de magia negra para manejar esto.

La vista solo es necesaria para el token de ventana, no tiene ningún otro impacto en la ubicación.

Gravity le dice al administrador de disposición dónde iniciar el sistema de coordenadas y cómo tratar esas coordenadas. No puedo encontrar los documentos, pero la piratería me muestra que:

  • CENTER utiliza el centro de la ventana emergente que se alineará con la x, y especificada. Por lo tanto, 0,0 está centrado en la pantalla
  • INFERIOR usa la parte inferior de la ventana emergente para alinearla con la x, y especificada. Entonces 0,0 tiene el fondo emergente alineado con la parte inferior de la pantalla. Si quiere 10px relleno, entonces y = 10 (no -10) para mover la ventana emergente 10 píxeles.

me escribió esto aquí Android PopupWindow.showAtLocation() and effects of Gravity

+0

funciona perfectamente. Gracias –

+0

Entonces, si quiero encajar en la parte inferior, acabo de usar esta línea 'mPw.showAtLocation (v, Gravity.BOTTOM, 0, 0);' ¿está bien en el dispositivo xxhpi, como Nexus 5? Tuve un problema con eso ... –

+0

Puede decir por la fecha en que esto fue publicado antes de los dispositivos xxhpi. Tu código debe hacer lo que esperas. Siga el enlace de escritura y vea mis ejemplos de imágenes publicadas de las diferentes opciones. – Bae

9
 View popupView = layoutInflater.inflate(R.layout.index_popviewxml, 
       null); 


     final PopupWindow popupWindow = new PopupWindow(popupView, 
       LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT, true); 



     popupWindow.setTouchable(true); 
     popupWindow.setFocusable(true); 

     popupWindow.showAtLocation(popupView, Gravity.CENTER, 0, 0); 
+0

Esta llamada requiere el nivel de API 19.¿de todos modos puedo hacer este nivel de API por debajo de 19? –

Cuestiones relacionadas