Mostrar AlertDialog en cualquier posición de la pantalla

106

Cuando mostramos un AlertDialog en Android, se muestra en el centro de la pantalla. ¿Hay alguna forma de cambiar la posición?

gypsicoder
fuente

Respuestas:

255

Después de buscar en varias publicaciones he encontrado la solución.

El código se publica a continuación:

private CharSequence[] items = {"Set as Ringtone", "Set as Alarm"};
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setItems(items, new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int item) {

            if(item == 0) {

            } else if(item == 1) {

            } else if(item == 2) {

            }
        }
    });

     AlertDialog dialog = builder.create();
     dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
     WindowManager.LayoutParams wmlp = dialog.getWindow().getAttributes();

 wmlp.gravity = Gravity.TOP | Gravity.LEFT;
 wmlp.x = 100;   //x position
 wmlp.y = 100;   //y position

 dialog.show();

Aquí el valor de la posición x son píxeles de izquierda a derecha. Para la posición y, el valor es de abajo hacia arriba.

gypsicoder
fuente
1
También puede crear un cuadro de diálogo de alerta personalizado. Hace poco hice esto y luego tuve que obtener el ancho y la altura de la pantalla y luego establecer la X y la Y en función de un porcentaje de esos valores, de esa manera el diseño se amplió bien. developer.android.com/guide/topics/ui/dialogs.html#CustomDialog
Roloc
15
Funciona pero tuve que agregar esto: WMLP.gravity = Gravity.TOP | Gravity.LEFT; de lo contrario, los valores xey se utilizaron como compensaciones desde el centro de la pantalla.
BoD
1
Solo para compartir la experiencia: el código anterior solo funciona mientras el diálogo pueda permanecer completamente en la pantalla. Por ejemplo, si la nueva coordenada y es demasiado grande, el cuadro de diálogo se mueve a la posición más baja de la pantalla que aún muestra todo el cuadro de diálogo. La parte complicada aquí es que los valores xey de los parámetros de diseño muestran a partir de entonces ya no las coordenadas de la esquina superior izquierda de la ventana de diálogo y no se pueden usar para calcular un movimiento relativo de la ventana, por ejemplo, cuando reaccionando a un MotionEvent.
Nantoka
1
funciona como el encanto ... pero no es necesario configurarlo wmlp.x = 100; //x position wmlp.y = 100;, solo establece la gravedad wmlp.gravity = Gravity.TOP | Gravity.LEFT;es suficiente
Ajay Mistry
14

Si, por ejemplo, desea mover el cuadro de diálogo de progreso un poco más hacia abajo y no establecer la posición exacta del píxel, esto es suficiente:

progressDialog.getWindow().getAttributes().verticalMargin = 0.2F;
pgsandstrom
fuente
Quiero darle alrededor de 10 dp de margen al diálogo de alerta cuya gravedad es el centro. ¿Puedo usar el código anterior? Si no es así, ¿hay alguna otra forma de hacerlo?
Aman Verma
5

Para hacer que la configuración tenga un efecto de información, agregué el siguiente código
dialog.getWindow().setAttributes(wmlp);

después de cambiar el valor de wmlp en la respuesta de gypsicoder, o la configuración de wmlp no entra en vigencia en mi prueba.

juejiang
fuente
0

Estas respuestas moverán la posición del AlertDialog, sin embargo, la posición del diálogo mostrado también incluirá el relleno alrededor del diálogo.

Si desea deshacerse de este relleno (por ejemplo, para colocar su cuadro de diálogo al ras contra la parte inferior de la pantalla), también deberá anular el estilo AlertDialog predeterminado en su styles.xml para establecer el windowBackground en nulo, así :

<resources>
    <!--  Example app theme - mine uses the below -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="android:alertDialogTheme">@style/MyDialogTheme</item>
    </style>

    <style name="MyDialogTheme" parent="Theme.AppCompat.Light.Dialog.Alert">
    <!-- Full width -->
        <item name="android:layout_width">fill_parent</item>

    <!-- Null window background kills surrounding padding -->
        <item name="android:windowBackground">@null</item>
        <item name="android:windowNoTitle">true</item>

     </style>
</resources> 

Además de configurar Window.LayoutParameters como se describe en la respuesta aceptada.

Un agradecimiento especial a @David Caunt cuya respuesta en: eliminar borde, relleno de Dialog completó esta imagen.

HappyKatz
fuente