onConfigurationChanged не вызывается - PullRequest
136 голосов
/ 11 апреля 2011

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

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

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

Ответы [ 16 ]

245 голосов
/ 09 сентября 2011

Это был мой gremlin для той же проблемы:

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

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

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

35 голосов
/ 24 мая 2011

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

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

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

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

34 голосов
/ 28 февраля 2013

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

android:configChanges="orientation|screenSize"
27 голосов
/ 09 февраля 2013

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

19 голосов
/ 11 апреля 2011
  1. Убедитесь, что вы не используете android:screenOrientation на уровне Activity или Application.
  2. Попробуйте использовать android:configChanges="orientation|keyboardHidden".
17 голосов
/ 08 января 2016

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

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

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

14 голосов
/ 15 мая 2011

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

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

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

5 голосов
/ 28 ноября 2012

У меня была такая же проблема - 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"/>
3 голосов
/ 02 апреля 2014

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

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

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

3 голосов
/ 13 августа 2013
<uses-sdk android:minSdkVersion="8" android:maxSdkVersion="17" />

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

android:configChanges="orientation|keyboardHidden|screenLayout"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...