Android, як не знищити активність, коли я обертаю пристрій?


81

У мене є програма, яка працює лише в портретному режимі, і я вніс зміни у свій файл маніфесту для кожної діяльності, орієнтація якої має бути портретною. Але коли я обертаю пристрій, активність відтворюється знову. Як не знищити діяльність?


1
Цього часто не рекомендують, ви можете спробувати встановити орієнтацію додатків програмним способом, наприклад: setReantedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
stealthcopter

7
Чому це було б проти? Скажімо, у нас є сервіс, на який потрібно 2 секунди. Якщо діяльність щоразу руйнується, ця служба продовжує працювати кожен раз, тоді як мені потрібно лише один раз.
Мохамед Мансур

Відповіді:


131

Для API 12 і нижче : додати

android:configChanges="orientation"

Додайте "screenSize", якщо ви націлюєтеся на API 13 або новішої версії, тому що, коли орієнтація змінюється, змінюється і розмір екрана, інакше нові пристрої продовжуватимуть руйнувати вашу активність. Докладнішу інформацію про використання "screenSize" див. У відповіді Egg нижче

android:configChanges="orientation|screenSize"

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


Діяльність перезапускається знову. Я не знаю, який сенс робити все те, що потрібно робити, коли діяльність обертається, навіть якщо вона не обертається віртуально. Чи є спосіб вимкнути повідомлення, які датчик надсилає ОС про обертання, або щось подібне, щоб вирішити цю проблему з кореня?
Василь

6
на якому пристрої ви програмуєте? пам’ятайте, що, наприклад, висунення клавіатури може також перезапустити вашу активність ... (якщо це причина встановити confChanges на "keyboard | keyboardHidden |

2
Це вимикає зміну макета. Як це виправити?
Remian8985

1
Це рішення вирішує дії знищення та створення, але, як обробляти зміни макета. Я маю на увазі сказати, коли змінюється орієнтація, завантажується відповідний макет.
sandeepmaaram

Чи є спосіб встановити параметр android: configChanges програмно, на відміну від файлу маніфесту?
CodyF

108

З офіційного документа Флурін сказано:

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

Отже, якщо ваш додаток націлений на рівень API 13 або вище, замість цього слід встановити цю конфігурацію:

android:configChanges="orientation|screenSize"


4
Дуже дякую! Усі інші відповіді пропускають цю частину, коли рівень API 13 вводить цей екранРазмір. Ви щойно врятували мені життя! :)
Tamás Barta

1
@egg Дякую вамуууууу! :) Це допомогло!
KarenAnne

1
Чудова порада: важко встигати за документацією, коли ви робите це неповний робочий день.
wallerjake

1
+1 Хороший сенсорний чоловік. Дякуємо, що поділилися цим рішенням для нас. Ти врятував мій день. Спасибі;)
Саймон Дороцяк,

9

Правильним рішенням є

android:configChanges="orientation|screenSize"

Документація для Android:

Поточний доступний розмір екрана змінився. Це являє собою зміну доступного на даний момент розміру щодо поточного співвідношення сторін, тому буде змінюватися, коли користувач перемикається між альбомною та книжковою. Однак, якщо ваша програма націлена на рівень API 12 або нижче, ваша діяльність завжди сама обробляє цю зміну конфігурації (ця зміна конфігурації не перезапускає вашу активність, навіть коли вона працює на пристрої Android 3.2 або новішої версії). *


5

Я трохи зіпсував це, а потім зрозумів, що всередині файлу маніфесту я розміщую 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">
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>
            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
    </activity> 
</application> 

2
Ви повинні ділитися кодом у своєму дописі замість зображення.
Жуль Дюпон,

Будь ласка, відредагуйте свою публікацію та покажіть фактичний код маніфесту у вигляді тексту замість скріншотів. Інші не можуть копіювати та вставляти з ваших зображень. Детальніше див. Тут . Дякую.
Pang

1

Тепер, коли Android підтримує розділений екран ("багатовіконний" мовою Android), ви, ймовірно, захочете також додати орієнтацію screenSize | najmanшийScreenSize | 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>


-1

напишіть у маніфесті:

android:configChanges="orientation|screenSize|keyboardHidden"

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

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

5
Чому перевизначення методу onConfigurationChanged і виклик оригінальної реалізації робить щось корисне?
ricosrealm
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.