Как сохранить всплывающее окно открытым при изменении ориентации во время выполнения в Android? - PullRequest
7 голосов
/ 03 марта 2012

Я создал всплывающее окно, которое содержит представление месяца, чтобы забрать дату.Когда я меняю ориентацию, из-за того, что Android загружает активность снова, мое всплывающее окно исчезает.Как я могу сделать его открытым даже при изменении ориентации во время выполнения?

Ответы [ 4 ]

5 голосов
/ 03 марта 2012

включает android:configChanges="orientation" в вашем AndroidManifest.xml в окне отображения активности. Это говорит Android о том, что вы собираетесь самостоятельно изменить ориентацию, и в конечном итоге это не разрушит вашу активность и не отобразит окно.

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

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);

    if(newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE)
        Log.i("orientation", "Orientation changed to: Landscape");
    else
        Log.i("orientation", "Orientation changed to: Portrait");
}

для предварительного просмотра, загрузки и установки этого примера приложения .

4 голосов
/ 03 марта 2012

Всякий раз, когда происходит изменение ориентации, Android уничтожает вашу активность (звонки onDestroy()) и затем перезапускает ее (звонки onCreate()).
Как только ваше всплывающее окно будет установлено, установите флаг popup_open=1. Ваше всплывающее окно, естественно, будет иметь кнопку отклонения. Установите флаг = 0 в обработчике нажатия этой кнопки. Затем вы можете снова открыть всплывающее окно при перезапуске приложения в методе onRestoreInstanceState() или в onCreate(). Здесь вы бы сделали проверку на флаг. Если флаг установлен в 1, вызовите всплывающее окно. Таким образом, даже если ориентация изменилась во время всплывающего окна, onRestoreInstanceState() будет знать, что делать, основываясь на состоянии флага. Для более подробной проверки: Как обрабатывать изменения во время выполнения .

1 голос
/ 03 марта 2012

Добавьте это свойство к вашей деятельности в manifest.xml

android:configChanges="orientation|keyboard" 

и это должно сделать.

0 голосов
/ 23 августа 2014

Отображение PopupWindow как

final View parent = findViewById(R.id.{parentId});
parent.post(new Runnable() {
    @Override
    public void run() {
        mPopup.showAtLocation(parent, ...);
    }
});

разрешает необработанное исключение при изменении ориентации

...