Zeigen Sie AlertDialog an einer beliebigen Position des Bildschirms an

106

Wenn wir einen AlertDialog in Android anzeigen, wird er in der Mitte des Bildschirms angezeigt. Gibt es eine Möglichkeit, die Position zu ändern?

Gypsicoder
quelle

Antworten:

255

Nach der Suche in verschiedenen Beiträgen habe ich die Lösung gefunden.

Der Code ist unten angegeben:

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

Hier ist der Wert der x-Position Pixel von links nach rechts. Für y ist der Positionswert von unten nach oben.

Gypsicoder
quelle
1
Sie können auch einen benutzerdefinierten Warndialog erstellen. Ich habe dies erst kürzlich getan und musste dann die Breite und Höhe der Anzeigen ermitteln und dann X und Y basierend auf einem Prozentsatz dieser Werte einstellen, damit das Layout gut skaliert werden konnte. developer.android.com/guide/topics/ui/dialogs.html#CustomDialog
Roloc
15
Es funktioniert, aber ich musste Folgendes hinzufügen: WMLP.gravity = Gravity.TOP | Schwerkraft.LINKS; Andernfalls wurden die x- und y-Werte als Offsets von der Bildschirmmitte verwendet.
BoD
1
Nur um die Erfahrung zu teilen: Der obige Code funktioniert nur, solange der Dialog vollständig auf dem Bildschirm angezeigt werden kann. Wenn beispielsweise die neue y-Koordinate zu groß ist, wird der Dialog an die niedrigste Position auf dem Bildschirm verschoben, auf der immer noch der gesamte Dialog angezeigt wird. Der schwierige Teil hierbei ist, dass die x- und y-Werte der Layoutparameter von nun an nicht mehr die Koordinaten der oberen linken Ecke des Dialogfensters anzeigen und nicht mehr zur Berechnung einer relativen Bewegung des Fensters verwendet werden können, beispielsweise wenn auf ein MotionEvent reagieren.
Nantoka
1
funktioniert wie Charme .. aber keine Notwendigkeit, wmlp.x = 100; //x position wmlp.y = 100;Sie einzustellen , nur die Schwerkraft wmlp.gravity = Gravity.TOP | Gravity.LEFT;ist genug
Ajay Mistry
14

Wenn Sie beispielsweise den Fortschrittsdialog etwas weiter nach unten verschieben und nicht die exakte Pixelposition festlegen möchten, ist dies ausreichend:

progressDialog.getWindow().getAttributes().verticalMargin = 0.2F;
pgsandstrom
quelle
Ich möchte dem Alarmdialog, dessen Schwerpunkt im Mittelpunkt steht, einen Rand von etwa 10 dp geben. Kann ich den obigen Code verwenden? Wenn nicht, gibt es dann eine andere Möglichkeit, dies zu tun?
Aman Verma
5

Um die Einstellung auf den Info-Effekt zu bringen, habe ich den folgenden Code hinzugefügt
dialog.getWindow().setAttributes(wmlp);

Nach der Änderung wird der Wert von wmlp in der Antwort von gypsicoder oder die Einstellung von wmlp durch meinen Test nicht wirksam.

Juejiang
quelle
0

Diese Antworten verschieben die Position des AlertDialogs. Die Position des angezeigten Dialogfelds enthält jedoch auch das Auffüllen des Dialogfelds.

Wenn Sie diese Auffüllung entfernen möchten (z. B. um Ihren Dialog bündig am unteren Bildschirmrand zu platzieren), müssen Sie auch den Standard-AlertDialog-Stil in Ihrer styles.xml überschreiben, um den windowBackground wie folgt auf null zu setzen ::

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

Sowie das Einstellen der Window.LayoutParameters wie in der akzeptierten Antwort beschrieben.

Ein besonderer Gruß an @David Caunt, dessen Antwort unter: Rand entfernen, Auffüllen aus Dialog vervollständigte dieses Bild.

HappyKatz
quelle