web-dev-qa-db-fra.com

Afficher AlertDialog à n’importe quelle position de l’écran

Lorsque nous affichons un AlertDialog dans Android, il apparaît au centre de l'écran. Existe-t-il un moyen de modifier la position?

103
gypsicoder

Après avoir cherché dans divers articles, j'ai trouvé la solution.

Le code est affiché ci-dessous:

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();

Ici, la valeur de x position est exprimée en pixels de gauche à droite. Pour la position y, la valeur est de bas en haut.

243
gypsicoder

Si, par exemple, vous souhaitez déplacer le dialogue de progression un peu plus bas et ne pas définir la position exakt pixel, cela suffit alors:

progressDialog.getWindow().getAttributes().verticalMargin = 0.2F;
14
pgsandstrom

Pour que le réglage vienne effet info, j'ai ajouté le code suivant
dialog.getWindow().setAttributes(wmlp);

after change la valeur de wmlp dans la réponse de gypsicoder, ou le réglage de wmlp n’est pas pris en compte par mon test.

5
juejiang

Ces réponses déplaceront la position de AlertDialog. Cependant, la position de la boîte de dialogue affichée inclura également le remplissage autour de la boîte de dialogue.

Si vous souhaitez vous débarrasser de ce remplissage (par exemple, pour que votre boîte de dialogue apparaisse au bas de l'écran), vous devez également remplacer le style AlertDialog par défaut dans votre fichier styles.xml afin de définir la valeur windowBackground sur null, comme suit. :

<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> 

En plus de définir les paramètres Window.Layout comme décrit dans la réponse acceptée.

Cri spécial à @David Caunt dont la réponse à: supprimer la bordure, le rembourrage de Dialog complète cette image.

0
HappyKatz