Зміна положення діалогового вікна на екрані Android


111

Я зробив простий AlertDialogу своїй діяльності :

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

infoDialog.show();

З наведеним вище кодом діалогове вікно відображається у центрі екрану (приблизно).

Мені цікаво, як я можу налаштувати положення діалогу, щоб воно відображалося під верхньою панеллю дій? (Чи все-таки потрібно змінити гравітацію або щось із діалогового вікна?) І як це зробити на основі мого коду ??


Якщо ви покажете нам свою версію my_dialog xml, ми, ймовірно, можемо допомогти вам внести зміни.
Алан Мур


@ Ankit, чи можете ви поставити свій коментар як відповідь, тому що мою проблему вирішують після перевірки вашого посилання.
Leem.fin

Відповіді:


235

Я використовував цей код для відображення діалогового вікна внизу екрана:

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

Цей код також заважає андроїду затемнювати фон діалогового вікна, якщо він вам потрібен. Ви повинні мати можливість змінити параметр сили тяжіння, щоб перемістити діалогове вікно про


Привіт, дякую Я встановив її гравітацію вгорі, діалогове вікно переходить у верхню частину екрана, але воно також охоплювало мою панель дій, я б хотів, щоб діалог був зверху, але просто під панеллю дій ... як це налаштувати?
Leem.fin

6
Ви можете спробувати використати wlp.xта wlp.yполя для явного встановлення місця розташування діалогового вікна на екрані. Я сам цього не пробував, але, мабуть, це спрацює.
Алекс Г

4
Очищення затемнення для мене не спрацювало (хоча решта працювала як принадність). Я знайшов рішення для затемнення в іншому місці, у вигляді: window.clearFlags (WindowManager.LayoutParams.FLAG_DIM_BEHIND);
Rubberduck

@AleksG чи є спосіб змінити колір тьмяного фону, зберігаючи дайлог у центрі? Я спробував встановити windowIsFloating = false для дайлогічного стилю. Але це вирівняти дайлог до верху!
Кшитій

@Kshitij Якщо ви хочете вести діалог у центрі, вам не потрібен жоден із цього коду - Android за замовчуванням діалогових центрів. Що стосується зміни тьмяного кольору, то це контролюється темою. Ви можете змінити його, включивши відповідну тему у свій додаток. Я ніколи цього не пробував.
Алекс Г

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

ви можете налаштувати діалогове вікно на основі гравітації та параметрів макета, змінити гравітацію та параметр макета на основі вашої вимоги


1
Привіт, дякую Я встановив її гравітацію вгорі, діалогове вікно переходить у верхню частину екрана, але воно також охоплювало мою панель дій, я б хотів, щоб діалог був зверху, але просто під панеллю дій ... як це налаштувати?
Leem.fin

3
ви можете встановити марж верхньої частини макета
Рамеш Соланкі,

'FILL_PARENT'застаріло. Я перебуваю на API 21. Як за посиланням розробника
fWd82,

1
@ fWd82 тому використовуйте "MATCH_PARENT" замість цього
Вільям

13

Я знайшов цей фрагмент коду з коду @gypsicoder тут

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

Тут значення позиції x - пікселі зліва направо. Для y значення позиції - знизу вгору.


10

Для мене це вийшло досить добре, коли я намагався розмістити свій діалог десь точно в нижній частині текстового перегляду, де він був вибраний.

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




1

Для своєї діалогічної діяльності я використовував цей:

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

1

Я використовую цей метод

 @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

використовувати 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);
    }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.