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

Leem.fin
quelle
Wenn Sie uns Ihr my_dialog-XML-Layout zeigen, können wir Ihnen wahrscheinlich bei Änderungen helfen.
Alan Moore
Duplikat? stackoverflow.com/questions/5469005/…
Samir Mangroliya
@ 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

Aleks G.
quelle
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

Ramesh Solanki
quelle
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.

Md. Sajedul Karim
quelle
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);
}
Wahib Ul Haq
quelle
9

Neu BottomSheetDialog:

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

dialog.show();
mohamed murashid
quelle
5

Fügen Sie dies einfach Ihrem Code hinzu:

dialog.getWindow().setGravity(Gravity.BOTTOM);
Techashonline
quelle
1
dialog.getWindow().getAttributes().gravity = Gravity.BOTTOM;
Hossein Mansouri
quelle
1

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

WindowManager.LayoutParams lp = this.getWindow().getAttributes();
lp.gravity = Gravity.BOTTOM;
Andris
quelle
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;

}
Mue
quelle
0

benutze bottomSHeet:

BottomSheetDialog dialog = new BottomSheetDialog(YourActivity.this);
dialog.setContentView(YourView);
dialog.show();
abbasalim
quelle
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);
    }
}
NickUnuchek
quelle