¿Cómo la diferente Gravedad de los valores de efecto PopupWindow.showAtLocation() en Android?

No puedo encontrar buena documentación sobre PopupWindows showAtLocation y la Gravedad.

InformationsquelleAutor Bae | 2011-09-16

2 Comentarios

  1. 67

    Después de hacking para un par de horas tratando algunos de magia negra matemáticas para calcular los centros y tratar de alinear la vista mediante la Gravedad.La parte SUPERIOR me encontré un post que utiliza la Gravedad.CENTRO. Estoy recogiendo mis resultados aquí con la esperanza de que salva a alguien un poco de dolor.

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

    La vista solamente es necesario para la ventana de símbolo (token), ésta no tiene ningún impacto en la ubicación.

    De la gravedad dice el gestor de diseño donde para iniciar el sistema de coordenadas y de cómo tratar a esas coordenadas. No puedo encontrar la documentación, pero la piratería me muestra que:

    • CENTRO utiliza el medio de la ventana emergente para estar alineado a la x,y especifica. Así 0,0 está centrada en la pantalla, sin necesidad de nuevos ajustes para el tamaño de la barra de notificaciones.

    ¿Cómo Gravedad valores de efecto PopupWindow.showAtLocation() en Android

    • Parte INFERIOR se utiliza la parte inferior de la ventana emergente para estar alineado a la x,y especifica. Así 0,0 tiene en la ventana de la parte inferior alineado con la parte inferior de la pantalla. Si desea 10px relleno de entonces y=10 (no -10) para mover la ventana emergente de la pantalla de 10 píxeles.

    ¿Cómo Gravedad valores de efecto PopupWindow.showAtLocation() en Android

    • SUPERIOR utiliza la parte superior de la ventana emergente para estar alineado a la x,y especifica. Así 0,0 tiene el emergente de la parte superior alineado con la parte superior de la pantalla. Si desea 10px relleno de entonces y=10. NOTA Si no está en modo de pantalla completa, a continuación, usted debe también hacer ajustes de la barra de notificaciones.

    ¿Cómo Gravedad valores de efecto PopupWindow.showAtLocation() en Android

    • La gravedad.A la IZQUIERDA y a la Gravedad.DERECHO debería ser obvio ahora, para mi ejemplo, las imágenes son demasiado grandes para caber en la pantalla, de manera que se sujetan al tamaño de la pantalla, menos el relleno que estoy utilizando.
    • Cómo resolver el problema de que el popupwindow se recorta (Aparece fuera de la pantalla) si yo uso showAsDropDown? La documentación dice que esto no debe suceder, pero no es así. Traté de setClippingEnabled(true) seguido por actualizar() después de y antes de que me llame showAsDropDown pero el mismo problema existe. Gracias
  2. 11

    Puede cambiar la gravedad de un PopupWindow mediante el ajuste de Gravity.CENTER en el showAtLocation método:

    popupWindow.showAtLocation(anyView, Gravity.CENTER, 0, 0);

    Las imágenes a continuación muestran los efectos:

    Centro

    • Gravity.CENTER

    ¿Cómo Gravedad valores de efecto PopupWindow.showAtLocation() en Android

    Bordes

    • Gravity.TOP
    • Gravity.BOTTOM
    • Gravity.LEFT
    • Gravity.RIGHT

    ¿Cómo Gravedad valores de efecto PopupWindow.showAtLocation() en Android

    Esquinas

    • Gravity.TOP | Gravity.LEFT
    • Gravity.TOP | Gravity.RIGHT
    • Gravity.BOTTOM | Gravity.LEFT
    • Gravity.BOTTOM | Gravity.RIGHT

    ¿Cómo Gravedad valores de efecto PopupWindow.showAtLocation() en Android

    Compensaciones

    Puede seguir la posición cambiando las (x,y) compensaciones en

    popupWindow.showAtLocation(anyView, gravity, x, y);

    Por ejemplo

    popupWindow.showAtLocation(anyView, Gravity.BOTTOM, 0, 300);

    ¿Cómo Gravedad valores de efecto PopupWindow.showAtLocation() en Android

    Código

    Aquí es el código de los ejemplos anteriores. Ver Cómo hacer una simple Android ventana emergente para obtener más ayuda básica.

    int gravity = Gravity.CENTER;
    
    LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
    View popupView = inflater.inflate(R.layout.popup_window, null);
    int width = LinearLayout.LayoutParams.WRAP_CONTENT;
    int height = LinearLayout.LayoutParams.WRAP_CONTENT;
    boolean focusable = true;
    final PopupWindow popupWindow = new PopupWindow(popupView, width, height, focusable);
    popupView.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            popupWindow.dismiss();
            return true;
        }
    });
    
    popupWindow.showAtLocation(anyView, gravity, 0, 0);

    Ver también

    • Uso showAsDropDown si usted desea anclar la ventana emergente para una vista.
    • Cómo resolver el problema de que el popupwindow se recorta (Aparece fuera de la pantalla) si yo uso showAsDropDown? La documentación dice que esto no debe suceder, pero no es así. Traté de setClippingEnabled(true) seguido por actualizar() después de y antes de que me llame showAsDropDown pero el mismo problema existe. Gracias
    • No estoy seguro de que fuera de la mano. Le recomiendo que se haga una nueva pregunta para esta e incluyen la captura de pantalla y el código.
    • estoy teniendo el mismo problema. ¿Alguna vez resolverlo?

Dejar respuesta

Please enter your comment!
Please enter your name here