Изменение ориентации экрана Android приводит к закрытию приложения

У меня есть приложение, которое я настроил на отображение только в портретном режиме, установив

android:screenOrientation="portrait"

для каждого действия в манифесте. Это работает нормально, и экран моего приложения не поворачивается, когда я поворачиваю телефон.

Проблема в том, что если я запускаю приложение с телефоном в портретной ориентации, то когда запускается моя первая активность (анимированный экран-заставка), и я поворачиваю телефон в альбомную ориентацию, пока первая активность все еще работает, когда запускается следующая активность ( он запускается из блока finally потока первой активности) приложение закроется. Это не принудительный выход, он просто выходит на главный экран. В LogCat не создаются исключения или что-либо еще, что говорит о том, почему это происходит. Экран никогда не вращается (как и не должен). Если я запускаю приложение с телефона в альбомной ориентации, оно работает нормально. Это происходит только тогда, когда я начинаю с портрета, а потом поворачиваюсь к альбому.

я пробовал ставить

android:configChanges="orientation"

в каждой деятельности, и я также пытался

android:configChanges="orientation|keyboard|keyboardHidden|screenLayout"

Я пробовал вышеописанное с реализацией onConfigurationChanged и без нее в действиях. Когда я реализовал это, я просто проигнорировал его (просто вызвав super.onConfigurationChanged).

Я также попытался программно настроить активность на портретную ориентацию в дополнение к установке ее в манифесте.

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

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

Я запускаю оригинал Motorola Droid на Verizon с Android 2.3.2.


person Bob    schedule 28.02.2011    source источник
comment
Вы говорите, что когда вы принудительно портретируете, активность все равно будет поворачиваться в альбомную?   -  person Matthew Willis    schedule 01.03.2011


Ответы (2)


Я бы порекомендовал установить ориентацию внутри заставки или следующего действия программно. Попробуйте реализовать этот код:

//get the WindowManager Service
Display display = ((WindowManager) getSystemService(WINDOW_SERVICE)).getDefaultDisplay();
//get the orientation
int orientation = display.getOrientation();
//orientation % 2 == 0 is portrait mode,
if ((orientation % 2) != 0) (android.view.IWindowManager.Stub.asInterface(ServiceManager.getService("window"))).setOrientation(0);

Надеюсь, это сработает.

person andreasg    schedule 01.03.2011

Приложение закрывается при изменении ориентации, потому что вы должны предоставить определенные ресурсы в папке res

  • Например: layout-land в папке res или

обрабатывать изменения во время выполнения программно

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

    // Checks the orientation of the screen
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
        Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();
    } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
        Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();
    }
}
person Jeffy Lazar    schedule 18.03.2013