OnConfigurationChanged не получает вызов

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

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

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

Ответ 1

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

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

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

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

Ответ 2

Это был мой гремлин для одной и той же проблемы:

Внимание: начиная с Android 3.2 (уровень API 13), размер экрана "также изменяется, когда устройство переключается между портретным и ландшафтным ориентации. Таким образом, если вы хотите предотвратить перезагрузки во время выполнения из-за изменение ориентации при разработке для уровня API 13 или выше (как объявленные атрибутами minSdkVersion и targetSdkVersion), вы должен включать значение" screenSize "в дополнение к" ориентации ", стоимость. То есть, вы должны декалировать андроид: configChanges =" ориентация | Размер экрана". Однако, если ваш приложение нацеливается на уровень API 12 или ниже, тогда ваша деятельность всегда обрабатывает это изменение конфигурации (это изменение конфигурации не перезапускает вашу активность, даже при работе на Android 3.2 или более высокое устройство).

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

TL; DR: добавить "| screenSize" в configChanges при настройке уровня API 13 +

Ответ 3

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

android:configChanges="orientation|screenSize"

Ответ 4

убедитесь, что на вашем устройстве установлен параметр "Вращение экрана" ВКЛ

"Screen rotation" setting

Ответ 5

  • Убедитесь, что вы не используете android:screenOrientation на уровне Activity или на Application.
  • Вместо этого используйте android:configChanges="orientation|keyboardHidden".

Ответ 6

Macarse - 100% на деньги со своим вторым вариантом.

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

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

Ответ 7

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

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

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

Ответ 8

У меня была та же проблема - 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

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

Не используйте любые целевые версии sdk, чтобы усложнить вам задачу. и для всех уровней api используйте это как прослушиватель изменений конфигурации

android:configChanges="orientation|keyboardHidden|screenLayout"

Ответ 10

Не уверен, что это лучшее место для него, но, столкнувшись с этой проблемой, я заметил что-то интересное.

Если прослушиватель onConfigurationChanged() НЕ работает, то onCreate() вызывается каждый раз при изменении ориентации.

Если прослушиватель onConfigurationChanged() работает, тогда этот метод вызывается вместо onCreate(), когда изменяется ориентация.

Ответ 11

Я только что нашел, что если у вас есть:

android:screenOrientation="landscape"

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

это может быть похоже на:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

что установка ориентации блокирует onConfigurationChanged().

Ответ 12

Все решения не работают. Я пытаюсь удалить свою тему в файле манифеста 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>

Ответ 13

У меня была такая же проблема, и у меня были и "андроид: screenOrientation" и "android: configChanges", указанные в манифесте. Когда я удаляю первый, onConfigurationChanged() вызывается при вращении. Странно, но это woks)

Ответ 14

@thanhbinh84 Дал мне идею, что может быть причиной этого.
Удаление <item name="android:windowIsTranslucent">true</item> из моей темы в styles.xml исправлено это!

Ответ 15

У вас есть android.content.res.Configuration в ваших операторах импорта? Eclipse может автоматически вставлять импорт, если вы нажмете Ctrl+Shift+O.

Если это отсутствует, компилятор не сможет распознать, что вы законно переопределяете метод суперкласса и, таким образом, выкинете ошибку.