onConfigurationChanged не вызывается

144

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

Я включил android:configChanges="orientation"действие, определенное в манифесте, как указано в документации по Android, но это не имеет значения.

Вы столкнулись с этой проблемой?

lblasa
источник
1
У меня такая же проблема с android: configChanges = "keyboardHidden" - onConfigurationChanged не вызывается, когда мягкая клавиатура выдвигается или выдвигается.
Питер Витвоет,
keyboardHidden не запускается программной клавиатурой, только аппаратной клавиатурой, такой как выдвижная клавиатура на Droid.
nmr
10
Вы должны добавить screenSize в. android:configChanges Это то, что написано в javadoc Google: 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"это было так.
Anuj
@philipp Чего бы добиться при установке ориентации датчика? Не знаю, чем это может быть полезно. Тем не менее, спасибо за редактирование.
nmr
4 года спустя люди все еще кусаются этим :)
Дэниел Уилсон,
Спасибо. 30 минут бился головой о стену.
Лагос
Это идеальное решение
Анбарасу Чинна
40

Некоторые устройства 4.0 не вызывают onConfigurationChanged. Просто добавьте слушателя в screenSize.

android:configChanges="orientation|screenSize"
Корбелла
источник
Это решило мою проблему. Для моего планшета Nexus 7 было недостаточно переопределения onConfigurationChanged, тестирования Configuration.ORIENTATION_LANDSCAPEи включения ТОЛЬКО android:configChanges="orientation"в манифест. Спасибо
Jantzilla
Для меня это было решением 5.0.1.
Джастин
39

Проблема заключалась в том, что при использовании этого метода

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

для принудительной ориентации вашего изображения Activityв портретный режим вы не являетесь кандидатом на получение orientationизменений.

Таким образом, решение состоит в том, чтобы не setRequestOrientationиспользовать определенный режим. Но вместо этого используйтеSCREEN_ORIENTATION_SENSOR.

lblasa
источник
5
да, это работает, но что, если я не хочу, чтобы мое приложение менялось? Я хочу, чтобы он оставался в ландшафтном режиме.
Stoefln
вы должны указать <activity android: name = ". MyActivity" android: screenOrientation = "landscape"> </activity> в вашем файле-манифесте
Qadir Hussain
3
Как мне использовать это (когда пользователь нажимает "полноэкранный режим" на видеоплеере) И продолжать получать onConfigChanged, когда пользователь поворачивает свой телефон. То же поведение, что и в приложении YouTube. Это возможно?
Vucko
29

убедитесь, что на вашем устройстве включен параметр "Поворот экрана"

Настройка "поворота экрана"

Дмитрий Колесникович
источник
7
У меня была эта забавная проблема ...: D
Дхармендра
Можно ли повернуть действие, даже если параметр «Поворот экрана» выключен ?. Если ДА, скажите мне, как это сделать? .. Насколько я понимаю, это не сработает, но какое-то приложение меняет действие на ландшафт.
Шринивасан
1
Дерьмо !!! Потратил 4-5 часов, пытаясь заставить мой код работать! Как я узнал из другого ответа, один из способов изменить это - включить в манифест <android: Ориентация = "датчик">
suku
19
  1. Убедитесь, что вы не используете android:screenOrientationна уровне Activityили Applicationуровне.
  2. Попробуйте использовать android:configChanges="orientation|keyboardHidden"вместо этого.
Макарс
источник
1
как я могу использовать android: screenOrientation, и я хочу запустить метод onConfigurationChanged, что я могу сделать,
спасибо
17

Я потратил десятки минут, чтобы выяснить, почему не работает. Я добавил, screenSizeно это все равно не сработало.

Оказалось, что я добавил android:configChangesк <application>элементу, а не к <activity>элементу, как должен был!

Конечно, это была моя ошибка, но все мы знаем, что все мы тратим много времени на такую ​​глупую ошибку. Итак, я добавляю этот ответ на случай, если появится еще один глупый программист вроде меня.

Проклятые овощи
источник
Я тоже делаю то же самое, Спасибо, что спас меня
Праной Саркар
Хо, спасибо, чувак!
Лоран,
15

Macarse на 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"/>
aУченик
источник
9
Проблема заключается в отсутствии атрибута: screenize. Пожалуйста, обновите свой ответ. Это будет вводящее в заблуждение «исправление» для начинающих разработчиков
Andriod
@ user1281750 Спасибо, но как начинающий разработчик Android я не уверен, что именно вы говорите.
aLearner
@aLearner Я думаю, что имел в виду user1281750: на самом деле это не исправление! Что делать, если вам нужна более высокая версия sdk?
AgentKnopf 04
Я поделился тем, что у меня сработало. Я понимаю, что это, возможно, не решение. Но какая альтернатива? Какое «правильное» решение? А что означает «пропавший без вести attribute: screensize»? Было бы полезно предоставить более подробную информацию.
aLearner 05
Спасибо, приятель, это решение разрешило мою большую напряженность, лол .. Я занимался серфингом в течение часа, чтобы получить это ... оно также работает во всех обновленных версиях
Сампат Кумар
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>
thanhbinh84
источник
Есть ли способ избежать перезапуска активности без удаления windowNoTitle?
Манукумар
2

Ни одно из предложений не сработало для меня (я отреагировал на собственный проект этой проблемой), но после нескольких часов отладки я обнаружил, что если у вас есть эта строка в AppTheme файла 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