AlertDialog Отображает альбомный вид с ориентацией в альбомной ориентации. - PullRequest
2 голосов
/ 24 февраля 2012

Основная активность моего приложения установлена ​​в манифесте, чтобы всегда быть в книжной ориентации.Это прекрасно работает, когда я загружаю приложение на планшет.

Однако, когда я использую кнопку меню и нажимаю «Настройка», которая открывает AlertDialog, который раздувает макет XML, планшет будет отображать левую2/3 или около того всего диалога.Все остальное уходит за экран вправо.Этот случай возникает только в том случае, если я устанавливаю свое приложение на планшет, удерживая его в альбомном режиме, или если я переключаю планшет в альбомный режим, когда приложение не запущено (даже если я вернусь в «Портрет» и нажму на приложение).В диалоговом окне даже вызывается this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);, чтобы убедиться, что он остается в портретном режиме (даже если проблема сохраняется с этим вызовом или нет).

Другими словами, способ отображения AlertDialog в портретном режимечто он взрывает ландшафтный вид (и, следовательно, часть его выходит за экран), даже если фактическая ориентация AlertDialog является портретной, как и должно быть.

(я извиняюсь, если приведенная выше формулировка быласбивает с толку - попросите уточнить что-нибудь, если это необходимо.)

Так зачем планшету это делать?Я тестировал его на нескольких мобильных телефонах Android, и этого не происходит, поэтому я не понимаю, почему планшет будет это делать.

ПОБОЧНЫЕ ПРИМЕЧАНИЯ:

  • Это даже не происходит только для этого AlertDialog либо .. мое лицензионное соглашение, которое отображается в начале приложения (другое AlertDialog), также отображается таким образом, если я запускаю приложение в альбомной ориентацииmode.

  • Я даже позволил использовать альбомную ориентацию, избавившись от всех вызовов, чтобы задать портретный / альбомный режим, и планшет по-прежнему выводит диалоговое окно за пределы экрана, когда удерживается вкнижная ориентация только на планшете, но не на телефонах.

РЕДАКТИРОВАТЬ:

Этот код хорошо работает на телефоне, но проблема планшетавсе еще сохраняется.Если я раскомментирую dialog.show(); ниже, планшет и телефон отобразят нужные мне размеры, но на черном фоне вместо затемненного основного экрана.Есть идеи?

Вызывающая функция делает это:

showDialog(EXAMPLE_CASE);

Функция, которая вызывается вызывающей функцией:

protected Dialog onCreateDialog(final int id) {
        Dialog dialog;
        AlertDialog.Builder builder = new AlertDialog.Builder(this);

        Display display = getWindowManager().getDefaultDisplay(); 
        int mwidth = display.getWidth();
        int mheight = display.getHeight();

        WindowManager.LayoutParams lp = new WindowManager.LayoutParams();

        switch(id) {
        // Example of what all my cases look like (there were way too many to copy)
        case EXAMPLE_CASE:

            builder.setTitle("Example")
            .setMessage("Example message")
            .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialoginterface,int i) {
                    dialoginterface.dismiss();
                    showDialog(DIALOG_CHOICE);
                }
            })
           .setCancelable(false);

            dialog = builder.create();

            break;
        }


        if (dialog != null) {

            lp.copyFrom(dialog.getWindow().getAttributes());
            lp.width = mwidth;
            lp.height = mheight;
            lp.x = mwidth;
            //lp.y = mheight;
            lp.dimAmount=0.0f;
            //dialog.show();
            dialog.getWindow().setAttributes(lp);
            dialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);

            dialog.setOnDismissListener(new OnDismissListener() {
                @Override
                public void onDismiss(DialogInterface dialog) {
                    removeDialog(id);
                }
            });
        }

    return dialog;
}

1 Ответ

7 голосов
/ 24 февраля 2012

Вы можете попробовать получить размеры экрана следующим образом:

Display display = getWindowManager().getDefaultDisplay(); 
int mwidth = display.getWidth();
int mheight = display.getHeight();

А затем измените Dialog следующим образом:

AlertDialog.Builder adb = new AlertDialog.Builder(this);
Dialog d = adb.setView(new View(this)).create();
// (That new View is just there to have something inside the dialog that can grow big enough to cover the whole screen.)

d.show();

WindowManager.LayoutParams lp = new WindowManager.LayoutParams();
lp.copyFrom(d.getWindow().getAttributes());
lp.width = mwidth;
lp.height = myheight;

//change position of window on screen
lp.x = mwidth/2; //set these values to what work for you; probably like I have here at
lp.y = mheight/2;        //half the screen width and height so it is in center

//set the dim level of the background
lp.dimAmount=0.1f; //change this value for more or less dimming

d.getWindow().setAttributes(lp);

//add a blur/dim flags
d.getWindow().addFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND | WindowManager.LayoutParams.FLAG_DIM_BEHIND);

Кроме того, вы говорите, что раздуваете пользовательский макет. Вы пытались поработать с layout_height и layout_width представлений в этом макете, чтобы увидеть, имеет ли это значение?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...