109 votes

Afficher un AlertDialog à n'importe quel endroit de l'écran

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

268voto

gypsicoder Points 2306

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 la position x est exprimée en pixels de gauche à droite. Pour la position y la valeur est de bas en haut.

2 votes

Vous pouvez également créer un dialogue d'alerte personnalisé. J'ai récemment fait cela et j'ai dû obtenir la largeur et la hauteur de l'affichage, puis définir les valeurs X et Y en fonction d'un pourcentage de ces valeurs, ce qui a permis de mettre la mise en page à l'échelle. developer.Android.com/guide/topics/ui/dialogues.html#CustomDialog

16 votes

Ça marche mais j'ai dû ajouter ceci : WMLP.gravity = Gravity.TOP | Gravity.LEFT ; sinon les valeurs x et y étaient utilisées comme décalages par rapport au centre de l'écran.

1 votes

Juste pour partager l'expérience : Le code ci-dessus ne fonctionne que si le dialogue peut rester entièrement sur l'écran. Par exemple, si la nouvelle coordonnée y est trop grande, la boîte de dialogue est déplacée vers la position la plus basse de l'écran qui montre encore la totalité de la boîte de dialogue. La partie délicate ici est que les valeurs x et y des paramètres de mise en page ne sont plus les coordonnées du coin supérieur gauche de la fenêtre de dialogue et ne peuvent plus être utilisées pour calculer un mouvement relatif de la fenêtre, par exemple en réagissant à un MotionEvent.

17voto

pgsandstrom Points 5085

Si vous souhaitez par exemple déplacer la boîte de dialogue de progression un peu plus bas et ne pas définir la position exacte des pixels, cela suffit :

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

0 votes

Je veux donner environ 10 dp de marge au dialogue d'alerte dont la gravité est au centre. Puis-je utiliser le code ci-dessus ? Si non, y a-t-il un autre moyen de le faire ?

8voto

juejiang Points 50

Pour que le paramètre devienne effectif, j'ai ajouté le code suivant
dialog.getWindow().setAttributes(wmlp);

après avoir changé la valeur de wmlp dans la réponse de gypsicoder, ou le paramètre de wmlp ne prend pas en compte par mon test.

1voto

HappyKatz Points 399

Ces réponses déplacent la position de la boîte de dialogue AlertDialog, mais la position de la boîte de dialogue affichée inclut également le remplissage autour de la boîte de dialogue.

Si vous voulez vous débarrasser de ce remplissage (par exemple, pour placer votre boîte de dialogue au ras du fond de l'écran), vous devrez également remplacer le style AlertDialog par défaut dans votre fichier styles.xml pour définir la valeur null de windowBackground, 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> 

Ainsi que la définition de Window.LayoutParameters comme décrit dans la réponse acceptée.

Un coup de chapeau spécial à @David Caunt dont la réponse à : supprimer la bordure et le remplissage de la boîte de dialogue a complété cette image.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X