Не перезагружать приложение при изменении ориентации

Мне просто не нужно ничего менять, когда экран вращается. Мое приложение отображает случайное изображение, когда оно сначала загружается, и вращение устройства не должно выбирать другое случайное изображение. Как я могу (просто) остановить это поведение?

Ответ 1

Обычно существует три способа сделать это:

  • Как и некоторые из предложенных ответов, вы можете отличить случаи своей деятельности, создаваемой в первый раз, и быть восстановленными с savedInstanceState. Это делается путем переопределения onSaveInstanceState и проверки параметра onCreate.

  • Вы можете заблокировать активность в одной ориентации, добавив android:screenOrientation="portrait" (или "landscape") к <activity> в ваш манифест.

  • Вы могли бы сообщить системе, что вы собираетесь обрабатывать изменения экрана для себя, указав android:configChanges="orientation|screenSize" в теге <activity>. Таким образом, активность не будет воссоздана, но вместо этого получит обратный вызов (который вы можете игнорировать, поскольку он вам не подходит).

Лично я бы пошел с (3). Конечно, если вы закрываете приложение одной из ориентаций, вы также можете пойти с (2).

Ответ 2

Ответ Xion был близок, но # 3 (android:configChanes="orientation") не будет работать, если приложение не имеет уровня API 12 или ниже.

В уровне API 13 или выше размер экрана изменяется при изменении ориентации, поэтому это все еще приводит к уничтожению активности и ее началу при изменении ориентации.

Просто добавьте атрибут screenSize, как показано ниже:

<activity
    android:name=".YourActivityName"
    android:configChanges="orientation|screenSize">
</activity>

Теперь, когда вы меняете ориентацию (и изменения размера экрана), активность сохраняет свое состояние и вызывается onConfigurationChanged(). При изменении ориентации будет сохраняться все, что находится на экране (т.е. Веб-страница в веб-просмотре).

Узнал об этом с этого сайта: http://developer.android.com/guide/topics/manifest/activity-element.html

Кроме того, это, по-видимому, плохая практика, поэтому прочитайте ссылку ниже о том, как обрабатывать изменения времени выполнения:

http://developer.android.com/guide/topics/resources/runtime-changes.html

Ответ 3

Вам просто нужно пойти в AndroidManifest.xml и внутри или в ваших ярлыках действий, вы должны набрать эту строку кода, как сказал кто-то там:

android:configChanges="orientation|screenSize"

Итак, у вас будет что-то вроде этого:

<activity android:name="ActivityMenu"
android:configChanges="orientation|screenSize">
</activity>

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

Ответ 4

<activity android:name="com.example.abc" 
 android:configChanges="orientation|screenSize"></activity>

Просто добавьте android:configChanges="orientation|screenSize" на вкладку активности файла манифеста.

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

Ответ 5

По моему опыту, на самом деле лучше просто справляться с ориентацией, а не пытаться обучать поведению, отличному по умолчанию.

Вы должны сохранить изображение, которое в настоящее время отображается в onSaveInstanceState(), и восстановить его правильно, когда ваше приложение снова пробегает onCreate().

Ответ 6

Это решение, безусловно, является лучшим рабочим. В файле манифеста добавьте

<activity
    android:configChanges="keyboardHidden|orientation|screenSize"
    android:name="your activity name"
    android:label="@string/app_name" 
    android:screenOrientation="landscape">
  </activity

И в вашем классе активности добавьте следующий код

@Override
public void onConfigurationChanged(Configuration newConfig) 
{
    super.onConfigurationChanged(newConfig);
    if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
        //your code
    } else if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
  //your code

    }
}

Ответ 7

Просто добавьте это в свой AndroidManifest.xml

<activity android:screenOrientation="landscape">

Я имею в виду, что есть тег активности, добавьте это как еще один параметр. Если вам нужна портретная ориентация, измените пейзаж на портрет. Надеюсь, это поможет.

Ответ 8

добавить android:configChanges="keyboardHidden|orientation|screenSize" для всех тегов действий приложения в манифесте.

Ответ 9

Сохраните детали изображения в onPause() или onStop() и используйте его в onCreate(Bundle savedInstanceState) для восстановления изображения.

EDIT:

Подробнее о реальном процессе подробно описано здесь http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle, поскольку он отличается от сотовых, чем предыдущие версии Android.

Ответ 10

просто используйте: android:configChanges="keyboardHidden|orientation"

Ответ 11

Как отметил Пасерьер,

android:configChanges="orientation|screenSize"

Ответ 12

В явном файле добавьте к каждой активности это. Это поможет android: configChanges = "ориентация | клавиатура | клавиатураHidden | screenLayout | screenSize"

Ответ 13

Все вышеперечисленные ответы не работают для меня. Итак, я исправил упоминание label с screenOrientation, как показано ниже. Теперь все прекрасно

<activity android:name=".activity.VideoWebViewActivity"
        android:label="@string/app_name"
        android:configChanges="orientation|screenSize"/>

Ответ 15

Добавьте этот код после метода onCreate, который содержит WebView

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);    
}

@Override
protected void onRestoreInstanceState(Bundle state) {
    super.onRestoreInstanceState(state);    
}