Mostra AlertDialog in qualsiasi posizione dello schermo


Risposte:


255

Dopo aver cercato in vari post ho trovato la soluzione.

Il codice è pubblicato di seguito:

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

Qui il valore della posizione x è pixel da sinistra a destra. Per la posizione y il valore va dal basso verso l'alto.


1
Puoi anche creare una finestra di dialogo di avviso personalizzata. L'ho fatto di recente e quindi ho dovuto ottenere la larghezza e l'altezza del display e quindi impostare X e Y in base a una percentuale di quei valori, in questo modo il layout si ridimensionava bene. developer.android.com/guide/topics/ui/dialogs.html#CustomDialog
Roloc

15
Funziona ma ho dovuto aggiungere questo: WMLP.gravity = Gravity.TOP | Gravity.LEFT; altrimenti i valori xey sono stati usati come offset dal centro dello schermo.
CdA

1
Solo per condividere l'esperienza: il codice sopra funziona solo finché la finestra di dialogo può rimanere completamente sullo schermo. Ad esempio, se la nuova coordinata y è troppo grande, la finestra di dialogo viene spostata nella posizione più bassa sullo schermo che mostra ancora l'intera finestra di dialogo. La parte difficile qui è che i valori xey dei parametri di layout da quel momento in poi non mostrano più le coordinate dell'angolo in alto a sinistra della finestra di dialogo e non possono essere utilizzati per calcolare un movimento relativo della finestra, ad esempio quando reagire a un MotionEvent.
Nantoka

1
funziona come un fascino ... ma non c'è bisogno di impostare wmlp.x = 100; //x position wmlp.y = 100;, basta impostare la gravità wmlp.gravity = Gravity.TOP | Gravity.LEFT;è sufficiente
Ajay Mistry

14

Se ad esempio si desidera spostare la finestra di dialogo di avanzamento un po 'più in basso e non impostare la posizione del pixel esatto, è sufficiente:

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

Voglio dare circa 10 dp di margine alla finestra di dialogo di avviso la cui gravità è il centro. Posso usare il codice sopra? In caso contrario, esiste un altro modo per farlo?
Aman Verma

5

Per rendere l'impostazione come effetto info, ho aggiunto il seguente codice
dialog.getWindow().setAttributes(wmlp);

dopo aver modificato il valore di wmlp nella risposta di gypsicoder, o l'impostazione di wmlp non ha effetto dal mio test.


0

Queste risposte sposteranno la posizione di AlertDialog, tuttavia, la posizione della finestra di dialogo visualizzata includerà anche il riempimento intorno alla finestra di dialogo.

Se vuoi sbarazzarti di questo riempimento (ad esempio, per posizionare la tua finestra di dialogo a filo nella parte inferiore dello schermo), dovrai anche sovrascrivere lo stile predefinito di AlertDialog nel tuo styles.xml per impostare windowBackground su null, in questo modo :

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

Oltre a impostare Window.LayoutParameters come descritto nella risposta accettata.

Un ringraziamento speciale a @David Caunt la cui risposta a: rimuovi bordo, imbottitura dal dialogo ha completato questa immagine.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.