Zmiana pozycji okna dialogowego na ekranie android


111

Zrobiłem proste AlertDialogw mojej aktywności :

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

infoDialog.show();

W przypadku powyższego kodu okno dialogowe jest wyświetlane w (mniej więcej) środku ekranu.

Zastanawiam się, jak mogę dostosować pozycję okna dialogowego, aby wyświetlało się tuż pod górnym paskiem akcji? (Czy jest jakaś zmiana grawitacji czy coś w tym oknie?) I jak to zrobić na podstawie mojego kodu?


Jeśli pokażesz nam swój układ my_dialog xml, prawdopodobnie pomożemy Ci wprowadzić zmiany.
Alan Moore


@ Ankit, czy możesz zamieścić swój komentarz jako odpowiedź, ponieważ mój problem został rozwiązany po sprawdzeniu twojego linku.
Leem.fin

Odpowiedzi:


235

Użyłem tego kodu, aby wyświetlić okno dialogowe u dołu ekranu:

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

Ten kod zapobiega również przyciemnianiu tła okna dialogowego przez system Android, jeśli jest to potrzebne. Powinieneś być w stanie zmienić parametr grawitacji, aby przesunąć okno dialogowe


Cześć Dziękuję Ci. Ustawiam jego grawitację na górze, okno dialogowe pojawia się u góry ekranu, ale obejmuje również mój pasek akcji, chciałbym, aby okno dialogowe było na górze, ale tuż pod paskiem akcji ... jak to zmienić?
Leem.fin

6
Możesz spróbować użyć pól wlp.xi, wlp.yaby jawnie ustawić lokalizację okna dialogowego na ekranie. Sam tego nie próbowałem, ale prawdopodobnie powinno działać.
Aleks G

4
Usunięcie ściemnienia nie działało dla mnie (chociaż reszta działała jak urok). Znalazłem rozwiązanie na ściemnianie w innym miejscu, w postaci: window.clearFlags (WindowManager.LayoutParams.FLAG_DIM_BEHIND);
Rubberduck,

@AleksG Czy jest sposób na zmianę koloru przyciemnionego tła, zachowując dziennik w centrum? Próbowałem ustawić windowIsFloating = false na styl dailog. Ale to wyrównać dziennik do góry!
Kshitij

@Kshitij Jeśli chcesz zachować dialog w centrum, nie potrzebujesz żadnego z tego kodu - domyślnie centruje dialogi Android. Jeśli chodzi o zmianę ciemnego koloru, jest to kontrolowane przez motyw. Możesz to zmienić, dodając odpowiedni motyw do swojej aplikacji. Jednak nigdy tego nie próbowałem.
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();
}

możesz dostosować swoje okno dialogowe w oparciu o grawitację i parametry układu, zmienić grawitację i parametr układu zgodnie z wymaganiami


1
Cześć Dziękuję Ci. Ustawiam jego grawitację na górze, okno dialogowe pojawia się u góry ekranu, ale obejmuje również mój pasek akcji, chciałbym, aby okno dialogowe było na górze, ale tuż pod paskiem akcji ... jak to zmienić?
Leem.fin

3
możesz ustawić górny margines układu
Ramesh Solanki

'FILL_PARENT'jest przestarzałe. Jestem na API 21. Zgodnie z informacją dla programistów
fWd82

1
@ fWd82, więc zamiast tego użyj „MATCH_PARENT”
William

13

Znalazłem ten fragment kodu z kodu @gypsicoder tutaj

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

Tutaj wartość pozycji x to piksele od lewej do prawej. Dla pozycji y wartość jest od dołu do góry.


10

Dla mnie to zadziałało całkiem nieźle, gdy próbowałem umieścić moje okno dialogowe dokładnie w dolnej części widoku tekstu, gdzie zostało wybrane.

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

10

Nowy BottomSheetDialog:

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

dialog.show();



1

Do mojej aktywności w Dialogu użyłem tego:

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

1

używam tej metody

 @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

użyj 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);
    }
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.