onConfigurationChanged не отримує виклику


141

Сьогодні вранці я зіткнувся з проблемою, намагаючись впоратися з onConfigurationChangedподією. Проблема полягає в тому, що метод, який я перекриваю, не викликає, коли я змінюю орієнтацію телефону. Не дзвонив взагалі.

Я ставлю android:configChanges="orientation"на активність, визначену в маніфесті, як згадується в документації на Android, але це не має значення.

Ви придумали цю проблему?


1
У мене однакова проблема для android: configChanges = "keyboardHidden" - onConfigurationChanged не викликається, коли м'яка клавіатура ковзає або вимикається.
Пітер Вітвоет

КлавіатураHidden не спрацьовує програмною клавіатурою, лише апаратними клавіатурами, як розсувна клавіатура Droid.
нм

10
Ви повинні додати "screenSize" у " android:configChanges Ось що сказав google javadoc: Note: If your application targets API level 13 or higher (as declared by the minSdkVersion and targetSdkVersion attributes), then you should also declare the "screenSize" configuration, because it also changes when a device switches between portrait and landscape orientations.
Ektos974

@ Ektos974 чудово! додавання screenSize отримує виклик onConfigurationChanged!
Мануела

Привіт, я використовую тему Theme.Holo.Light.NoActionBar. Для цього моя діяльність відновлюється. Чи є спосіб уникнути перезапуску діяльності?
Манукумар

Відповіді:


250

Це був мій гремлін для ~ тієї ж проблеми:

Попередження: Починаючи з Android 3.2 (рівень API 13), "розмір екрана" також змінюється, коли пристрій перемикається між портретною та пейзажною орієнтацією. Таким чином, якщо ви хочете запобігти перезапуску виконуваного часу через зміну орієнтації при розробці для API рівня 13 або вище (як заявлено атрибутами minSdkVersion та targetSdkVersion), вам слід додати значення "screenSize" на додаток до значення "орієнтація". Тобто, ви повинні обезголовити android: configChanges = "орієнтація | screenSize". Однак якщо ваша програма націлена на рівень API 12 або нижчий, ваша діяльність завжди обробляє цю зміну конфігурації (ця зміна конфігурації не перезапускає вашу активність, навіть коли ви працюєте на пристрої Android 3.2 або новішої версії).

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

TL; DR: додайте "| screenSize" в configChanges, коли орієнтуєтесь на рівень API 13+


9
Ух, просто єдиний атрибут повинен бути доданий і чорт за все, +1з мого боку "screenSize"це було.
Ануй

@philipp Що б досягти встановлення орієнтації на датчик? Не впевнений, як це було б корисно. Дякую за редагування.
nmr

Через 4 роки люди все ще покусані цим :)
Даніель Вілсон

Дякую. Провів 30 хвилин, вдарившись головою об стіну.
lagos

Це ідеальне рішення
Anbarasu Chinna

40

Деякі пристрої версії 4.0 не викликають onConfigurationChanged. Просто додайте слухача до screenSize теж.

android:configChanges="orientation|screenSize"

Це вирішило мою проблему. Перевизначення onConfigurationChanged, тестування Configuration.ORIENTATION_LANDSCAPEта включення ТОЛЬКО android:configChanges="orientation"до маніфесту було недостатньо для мого планшета Nexus 7. Спасибі
Jantzilla

37

Проблема полягала в тому, що якщо ви використовуєте цей метод

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

щоб примусити орієнтацію вашого Activityпортретного режиму, ви не кандидат на отримання orientationзмін.

Тож рішення - не setRequestOrientationдо конкретного режиму. Але замість цього використовуйтеSCREEN_ORIENTATION_SENSOR.


5
так, це працює, але що робити, якщо я не хочу, щоб мій додаток було повернено? Я хочу, щоб він залишався в ландшафтному режимі.
stoefln

ви повинні вказати <Activity android: name = ". MyActivity" android: screenOrientation = "пейзаж"> </activity> у своєму файлі menifest
Qadir Hussain

3
Як я обидва це використовую (коли користувач натискає "повний екран" на відеоплеєр), І продовжувати отримувати onConfigChanged, коли користувач повертає телефон. Така ж поведінка, як у програмі youtube. Це можливо?
Вучко

29

перевірте, чи у вашому пристрої встановлено значення "Поворот екрана"

Настройка "Поворот екрана"


7
У мене був цей кумедний випуск ...: D
Дхармендра

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

1
S ** t !!! Провів 4-5 годин, намагаючись змусити мій код працювати! Спосіб переосмислення цього, як я дізнаюся з іншої відповіді, - включити <android: орієнтація = "датчик"> в маніфест
suku

19
  1. Перевірте, що ви не використовуєте android:screenOrientationна рівні Activityабо на Applicationрівні.
  2. Спробуйте використовувати android:configChanges="orientation|keyboardHidden"замість цього.

1
як я можу використовувати android: screenOrientation, і я хочу, щоб метод onConfigurationChanged запустив, що я можу зробити, thx
Bingchean

17

Я витратив десятки хвилин, щоб з’ясувати, чому це не працює. Я додав, screenSizeале все ще не вийшло.

Виявилося, що я додав android:configChangesдо <application>елемента, а не до <activity>елемента, як я мав би мати!

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


Я теж роблю те, дякую, що ти мене врятував
Праной Саркар

Хо спасибі чувак!
Лоран

14

Макарс 100% на гроші з його другим варіантом.

Спробуйте android:configChanges="orientation|keyboardHidden|screenSize"

У мене була точно така ж проблема, і на емуляторі 1.6 додавання keyboardHiddenпричини onConfigurationChangedвикликати під час обертання. Видаліть його, і він перестане дзвонити.


5

У мене була така ж проблема - onConfigurationChangedне викликали, коли пристрій змінив орієнтацію, незважаючи на наявність android:configChanges="orientation|keyboardHidden"у файлі маніфесту. Я використав фрагмент коду, яким поділився Devaтут

орієнтація не працює в 2.3.3?

перевірити, чи onConfigurationChangedдзвонили. Це не так.

Після кількох годин експерименту я зрозумів, що у файлі маніфесту є наступні рядки

<uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="15"/>

і, переходячи android:targetSdkVersion="15"на android:targetSdkVersion="8", onConfigurationChangedпочали телефонувати. Отже, частина маніфесту нарешті виглядала так

<uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="8"/>

9
Проблема, яка виникає у вас, є відсутнім atribute: screenize. Будь ласка, оновіть свою відповідь. Це буде оманливим "виправданням" для початківців розробників
andriod

@ user1281750 Дякую, але як сам початківець розробник Android, я не впевнений, що це ви саме говорите.
aLearner

@aLearner Я думаю, що означав user1281750: Це насправді не виправлення! Що робити, якщо вам потрібна версія версії sdk?
AgentKnopf

Я поділився тим, що працювало на мене. Я розумію, що це може бути не "виправлення". Але яка альтернатива? Яке «правильне» рішення? І що означає «зниклі attribute: screensize»? Це може бути корисно, якщо буде надано більше деталей.
aLearner

Дякую приятелю, це рішення вирішило мою велику напругу, хай .. Я займався серфінгом протягом години, щоб отримати це ... його робота в усіх оновлених версіях також
Sampath Kumar

3

Я щойно встановив, що якщо у вас є:

android:screenOrientation="landscape"

в маніфесті, onConfigurationChanged () теж не буде називатися ...

це може бути схожим на:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

цей орієнтаційний блок блокує onConfigurationChanged ().


3
<uses-sdk android:minSdkVersion="8" android:maxSdkVersion="17" />

Не використовуйте жодних цільових версій sdk, щоб зробити вас ускладненням. і для всіх рівнів api використовуйте це як слухач зміни конфігурації

android:configChanges="orientation|keyboardHidden|screenLayout"

3

Не впевнений, що це найкраще місце для цього, але, зіткнувшись із цим питанням, я помітив щось цікаве.

Якщо слухач onConfigurationChanged () НЕ працює, тоді onCreate () викликається знову при кожному зміні орієнтації.

Якщо слухач onConfigurationChanged () працює, тоді цей метод викликається замість onCreate () при зміні орієнтації.


Це я бачу - але я не хочу бути таким. І згідно з документами, це не повинно відбуватися так. Так заплутано.
slycrel

2

Усі рішення не працюють утилітно. Я намагаюся видалити свою тематичну діяльність у файлі маніфесту Android. Так дивно

<activity
        android:name="MyActivity"
        android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation"
        android:theme="@style/MyTheme" --> remove this line
        />



<style name="MyTheme" parent="Theme.AppCompat.NoActionBar">
    <item name="windowNoTitle">true</item>
    <item name="android:windowIsTranslucent">true</item>
</style>

Чи є якийсь спосіб уникнути перезавантаження діяльності, не видаляючи windowNoTitle?
Манукумар

2

Жодна з пропозицій не працювала для мене (я зреагував на рідний проект із цим питанням), але через години налагодження я виявив, що якщо у вас є цей рядок у AppTheme of styles.xml

<item name="android:windowIsTranslucent">true</item>

тоді додаток не обертається.


1

@ thanhbinh84 Дав мені уявлення про те, що може бути причиною цього.
Видалення <item name="android:windowIsTranslucent">true</item> з моєї теми в styles.xml виправило її!


0

У мене була однакова проблема, і в мене було вказано і "android: screenOrientation", і "android: configChanges". Коли я видалив перший, onConfigurationChanged () викликають обертання. Дивно, але це хвилює)


1
Але як тоді обертатись?
Марк Моліна

-2

Чи потрапили android.content.res.Configurationу ваші заяви про імпорт? Eclipse може автоматично вставити імпорт, якщо натиснути Ctrl+Shift+O.

Якщо цього немає, компілятор не зможе визнати, що ви законно переосмислюєте метод надкласового класу, і таким чином видасть помилку.


Так, імпорт вже діє, якісь ідеї? тому що я не отримую жодної помилки чи нічого, це просто не називається.
lblasa

Я не знаю, чи це може бути пов'язано з тим, що вся заявка робиться в портретному режимі. Діяльність, в якій мені потрібно обробляти onConfigurationChangedEvent - це діяльність, що міститься в TabHost, режим якого є портретним. Але все одно, я не знайшов жодних коментарів, щоб це було проблемою для спіймання цієї події. Я справді не в ідеях.
lblasa
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.