Afficher AlertDialog dans n'importe quelle position de l'écran

106

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

gypsicoder
la source

Réponses:

255

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 correspond aux pixels de gauche à droite. Pour la position y, la valeur est de bas en haut.

gypsicoder
la source
1
Vous pouvez également créer une boîte de dialogue d'alerte personnalisée. Je viens de faire cela et j'ai ensuite dû obtenir la largeur et la hauteur de l'affichage, puis définir le X et le Y en fonction d'un pourcentage de ces valeurs, de cette façon, la mise en page était bien mise à l'échelle. developer.android.com/guide/topics/ui/dialogs.html#CustomDialog
Roloc
15
Cela fonctionne mais j'ai dû ajouter ceci: WMLP.gravity = Gravity.TOP | Gravity.LEFT; sinon, les valeurs x et y ont été utilisées comme décalages par rapport au centre de l'écran.
BoD
1
Juste pour partager l'expérience: le code ci-dessus ne fonctionne que tant que la boîte de dialogue peut rester complètement à 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 affiche toujours la boîte de dialogue entière. La partie délicate ici est que les valeurs x et y des paramètres de mise en page ne montrent désormais 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 lorsque réagissant à un MotionEvent.
Nantoka
1
des œuvres comme le charme ..mais pas besoin de définir que wmlp.x = 100; //x position wmlp.y = 100;vous venez de gravité ensemble wmlp.gravity = Gravity.TOP | Gravity.LEFT;est assez
Ajay Mistry
14

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

progressDialog.getWindow().getAttributes().verticalMargin = 0.2F;
pgsandstrom
la source
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? Sinon, y a-t-il un autre moyen de le faire?
Aman Verma
5

Pour que le réglage devienne un effet d'information, 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 réglage de wmlp ne prend pas effet par mon test.

Juejiang
la source
0

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 placer votre boîte de dialogue au ras du bas de l'écran), vous devrez également remplacer le style AlertDialog par défaut dans votre styles.xml pour définir windowBackground sur null, comme ceci :

<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 Window.LayoutParameters comme décrit dans la réponse acceptée.

Un cri spécial à @David Caunt dont la réponse à: supprimer la bordure, le rembourrage de Dialog a complété cette image.

HappyKatz
la source