Android, как не уничтожить активность при повороте устройства?

У меня есть приложение, которое работает только в портретном режиме, и я внес изменения в свой файл манифеста для каждого вида деятельности, который должен быть портретным. Но когда я поворачиваю устройство, активность снова воссоздается. Как не уничтожить деятельность?

6 ответов

Решение

Для API 12 и ниже: добавить

android:configChanges="orientation"

Добавьте "screenSize", если вы нацеливаетесь на API 13 или выше, потому что всякий раз, когда ваша ориентация меняется, размер экрана меняется, иначе новые устройства будут продолжать разрушать вашу активность. Смотрите ответ Egg ниже для получения дополнительной информации об использовании "screenSize"

android:configChanges="orientation|screenSize"

к вашей активности в AndroidManifest.xml. Таким образом, ваша активность не будет перезапущена автоматически. Смотрите документацию для получения дополнительной информации

Из официального документа Флурин сказал:

Примечание. Если ваше приложение предназначено для уровня API 13 или выше (как заявлено атрибутами minSdkVersion и targetSdkVersion), вам также следует объявить конфигурацию "screenSize", поскольку она также изменяется, когда устройство переключается между книжной и альбомной ориентациями.

Так что, если ваше приложение предназначено для уровня API 13 или выше, вы должны установить этот конфиг вместо:

android:configChanges="orientation|screenSize"

Правильное решение

андроид:configChanges="ориентация | Размер экрана"

Документация по Android:

Текущий доступный размер экрана изменился. Это представляет изменение доступного в настоящее время размера относительно текущего соотношения сторон, поэтому оно изменится, когда пользователь переключается между альбомным и портретным режимами. Однако, если ваше приложение предназначено для уровня API 12 или ниже, то ваша активность всегда сама обрабатывает это изменение конфигурации (это изменение конфигурации не перезапускает вашу активность, даже при работе на устройстве Android 3.2 или выше).

Я немного испортил это, а затем переделал, что в файле манифеста я помещал configChanges на уровень приложения, а не на уровень активности. Вот как выглядит код, когда он корректно работает для меня.

Изображение правильного кода файла манифеста

Теперь, когда Android поддерживает разделение экрана ("многооконный" на языке Android), вы, вероятно, захотите добавить также ориентацию screenSize|smallestScreenSize|screenLayout|. Итак, чтобы обрабатывать вращение и разделение экрана, вам понадобится что-то вроде этого в android:configChanges

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
        <activity android:name=".MainActivity"
                  android:configChanges="orientation|screenSize|keyboardHidden|smallestScreenSize|screenLayout">
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>
            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
    </activity> 
</application>

Посмотрите на этот код в плавающем изображении. У него самый интересный способ управления поворотом экрана. http://code.google.com/p/floatingimage/source/browse/

Напишите в манифесте:

android:configChanges="orientation|screenSize|keyboardHidden"

и переопределите это в деятельности, которая решила вашу проблему:

 @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
}
Другие вопросы по тегам