Ändern der Position des Dialogs auf dem Bildschirm Android


111

Ich habe AlertDialogin meiner Aktivität ein einfaches gemacht :

View view = layoutInflater.inflate(R.layout.my_dialog, null);
AlertDialog infoDialog = new AlertDialog.Builder(MyActivity.this)
                    .setView(view)  
                    .create();

infoDialog.show();

Mit dem obigen Code wird der Dialog in der Mitte des Bildschirms angezeigt.

Ich frage mich, wie ich die Dialogposition so anpassen kann, dass sie direkt unter der oberen Aktionsleiste angezeigt wird. (Gibt es sowieso eine Möglichkeit, die Schwerkraft oder etwas im Dialog zu ändern?) Und wie geht das basierend auf meinem Code?


Wenn Sie uns Ihr my_dialog-XML-Layout zeigen, können wir Ihnen wahrscheinlich bei Änderungen helfen.
Alan Moore


@ Ankit, kannst du deinen Kommentar als Antwort setzen, da mein Problem nach Überprüfung deines Links gelöst wird.
Leem.fin

Antworten:


233

Ich habe diesen Code verwendet, um den Dialog am unteren Bildschirmrand anzuzeigen:

Dialog dlg = <code to create custom dialog>;

Window window = dlg.getWindow();
WindowManager.LayoutParams wlp = window.getAttributes();

wlp.gravity = Gravity.BOTTOM;
wlp.flags &= ~WindowManager.LayoutParams.FLAG_DIM_BEHIND;
window.setAttributes(wlp);

Dieser Code verhindert auch, dass Android den Hintergrund des Dialogfelds bei Bedarf dimmt. Sie sollten in der Lage sein, den Schwerkraftparameter zu ändern, um den Dialog zu verschieben


Hallo Danke. Ich habe die Schwerkraft auf oben gesetzt, der Dialog wird oben auf dem Bildschirm angezeigt, aber er deckt auch meine Aktionsleiste ab. Ich möchte den Dialog oben, aber direkt unter der Aktionsleiste. Wie kann ich das anpassen?
Leem.fin

6
Sie können versuchen, mit wlp.xund wlp.yFelder die Position des Dialogfelds auf dem Bildschirm explizit festzulegen. Ich habe es nicht selbst versucht, aber es sollte wahrscheinlich funktionieren.
Aleks G

4
Das Löschen des Dimmens funktionierte bei mir nicht (obwohl der Rest wie ein Zauber wirkte). Ich habe eine Lösung für das Dimmen an einer anderen Stelle gefunden: window.clearFlags (WindowManager.LayoutParams.FLAG_DIM_BEHIND);
Rubberduck

@AleksG Gibt es eine Möglichkeit, auch die Farbe des dunklen Hintergrunds zu ändern und den Dailog in der Mitte zu halten? Ich habe versucht, windowIsFloating = false auf den Dailog-Stil zu setzen. Aber es richtet den Dailog nach oben aus!
Kshitij

@Kshitij Wenn Sie den Dialog in der Mitte halten möchten, benötigen Sie keinen dieser Codes - Android-Zentren-Dialoge standardmäßig. Das Ändern der dunklen Farbe wird durch das Thema gesteuert. Möglicherweise können Sie es überschreiben, indem Sie das entsprechende Thema in Ihre App aufnehmen. Ich habe es aber nie versucht.
Aleks G

23
private void showPictureialog() {
    final Dialog dialog = new Dialog(this,
            android.R.style.Theme_Translucent_NoTitleBar);

    // Setting dialogview
    Window window = dialog.getWindow();
    window.setGravity(Gravity.CENTER);

    window.setLayout(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
    dialog.setTitle(null);
    dialog.setContentView(R.layout.selectpic_dialog);
    dialog.setCancelable(true);

    dialog.show();
}

Sie können Ihren Dialog basierend auf der Schwerkraft und den Layoutparametern anpassen. Ändern Sie die Schwerkraft und die Layoutparameter entsprechend Ihren Anforderungen


1
Hallo Danke. Ich habe die Schwerkraft auf oben gesetzt, der Dialog wird oben auf dem Bildschirm angezeigt, aber er deckt auch meine Aktionsleiste ab. Ich möchte den Dialog oben, aber direkt unter der Aktionsleiste. Wie kann ich das anpassen?
Leem.fin

3
Sie können Rand oben des Layouts setzen
Ramesh Solanki

'FILL_PARENT'ist veraltet. Ich bin auf API 21. Wie von Developer Reference
fWd82

1
@ fWd82 also benutze stattdessen 'MATCH_PARENT'
William

12

Ich habe dieses Code-Snippet aus dem @ gypsicoder-Code hier gefunden

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.


10

Für mich hat das ziemlich gut geklappt, als ich versucht habe, meinen Dialog genau am unteren Rand der Textansicht zu positionieren, wo er ausgewählt wird.

public void setPosition(int yValue) {
    Window window = getWindow();
    WindowManager.LayoutParams param = window.getAttributes();
    param.gravity = Gravity.TOP | Gravity.CENTER_HORIZONTAL;
    param.y = yValue;
    window.setAttributes(param);
    window.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
}

9

Neu BottomSheetDialog:

BottomSheetDialog dialog = new BottomSheetDialog(YourActivity.this);    
dialog.setContentView(YourView);

dialog.show();

5

Fügen Sie dies einfach Ihrem Code hinzu:

dialog.getWindow().setGravity(Gravity.BOTTOM);


1

Für meine Dialogaktivität habe ich diese verwendet:

WindowManager.LayoutParams lp = this.getWindow().getAttributes();
lp.gravity = Gravity.BOTTOM;

1

Ich benutze diese Methode

 @Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    final Dialog dialog = new Dialog(getActivity());
    dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
    dialog.getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));
    Window window = dialog.getWindow();
    WindowManager.LayoutParams wlp = window.getAttributes();
    wlp.gravity = Gravity.BOTTOM;
    dialog.setContentView(R.layout.dialog_droppoint);
    dialog.show();
    window.setAttributes(wlp);
    return dialog;

}

0

benutze bottomSHeet:

BottomSheetDialog dialog = new BottomSheetDialog(YourActivity.this);
dialog.setContentView(YourView);
dialog.show();

0
public class MyDialogFragment extends DialogFragment{
    protected void setDialogGravity(int gravity) {
        Dialog dialog = getDialog();
        if (dialog != null) {
            Window window = dialog.getWindow();
            if (window != null) {
                WindowManager.LayoutParams params = window.getAttributes();
                params.width = WindowManager.LayoutParams.MATCH_PARENT;
                params.height = WindowManager.LayoutParams.MATCH_PARENT;
                params.horizontalMargin = 0;
                params.gravity = gravity;
                params.dimAmount = 0;
                params.flags &= ~WindowManager.LayoutParams.FLAG_DIM_BEHIND;
                window.setAttributes(params);
            }
        }
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        super.onCreateView(inflater,container,savedInstanceState);

        return inflater.inflate(R.layout.my_dialog, null);
    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
                super.onViewCreated(view, savedInstanceState);
                setDialogGravity(Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL);
    }
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.