onConfigurationChanged не вызывается
Сегодня утром я столкнулся с проблемой, пытаясь справиться с onConfigurationChanged
событие. Проблема в том, что метод, который я переопределяю, не вызывается, когда я меняю ориентацию телефона. Не звонят вообще.
Я положил android:configChanges="orientation"
на активность, определенную в манифесте, как указано в документации Android, но это не имеет значения.
Вы столкнулись с этой проблемой?
18 ответов
Проблема заключалась в том, что если вы используете этот метод
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
заставить ориентацию вашего Activity
в портретном режиме, вы не кандидат на получение orientation
изменения.
Таким образом, решение не setRequestOrientation
в конкретном режиме. Но вместо этого используйте SCREEN_ORIENTATION_SENSOR.
Это был мой гремлин для той же проблемы:
Внимание! Начиная с 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+
Некоторые устройства версии 4.0 не вызывают ConfigureChanged. Просто добавьте слушателя к screenSize.
android:configChanges="orientation|screenSize"
Убедитесь, что на вашем устройстве включена функция "Поворот экрана"
Я потратил десятки минут, чтобы выяснить, почему это не сработало. я добавил screenSize
но это все равно не сработало.
Оказалось, что я добавил android:configChanges
к <application>
элемент, а не к <activity>
элемент, как я должен был!
Ну, конечно, это была моя ошибка, но мы все знаем, что все мы тратим много времени на эту глупую ошибку. Итак, я добавляю этот ответ на случай, если найдется другой глупый программист, как я.
Macarse на 100% на деньгах с его вторым вариантом.
Пытаться android:configChanges="orientation|keyboardHidden|screenSize"
У меня была точно такая же проблема, и на добавлении эмулятора 1.6 keyboardHidden
причины onConfigurationChanged
быть вызванным во время вращения. Удалите его, и он перестанет называться.
- Убедитесь, что вы не используете
android:screenOrientation
вActivity
или вApplication
уровень. - Попробуйте использовать
android:configChanges="orientation|keyboardHidden"
вместо.
Не уверен, что это лучшее место для этого, но, столкнувшись с этой проблемой, я заметил кое-что интересное.
Если прослушиватель onConfigurationChanged() НЕ работает, то onCreate() вызывается снова каждый раз, когда изменяется ориентация.
Если прослушиватель onConfigurationChanged() работает, то этот метод вызывается вместо onCreate() при изменении ориентации.
У меня такая же проблема - 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"/>
Я только что обнаружил, что если у вас есть:
android:screenOrientation="landscape"
в манифесте onConfigurationChanged() тоже не будет вызываться...
это может быть похоже на:
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
этот параметр ориентации блокирует onConfigurationChanged().
<uses-sdk android:minSdkVersion="8" android:maxSdkVersion="17" />
Не используйте целевые версии SDK, чтобы усложнить вам задачу. и для всех уровней API используйте это как слушатель изменения конфигурации
android:configChanges="orientation|keyboardHidden|screenLayout"
Ни одно из предложений не сработало для меня (у меня был собственный проект с этой проблемой), но после нескольких часов отладки я обнаружил, что если у вас есть эта строка в AppTheme от styles.xml
<item name="android:windowIsTranslucent">true</item>
тогда приложение не будет вращаться.
Все решения не работают, но я пытаюсь удалить активность моей темы в файле манифеста 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 Дали мне идею, что может быть причиной этого.
Удаление<item name="android:windowIsTranslucent">true</item>
из моей темы в styles.xml это исправили!
помещать
<activity
name=".yourActivity"
android:configChanges="orientation|screenSize" />
в вашем манифесте в теге активности
затем добавьте
@Override
public void onConfigurationChanged(Configuration newConfig) {
//don't reload the current page when the orientation is changed
Log.d(TAG, "onConfigurationChanged() Called");
super.onConfigurationChanged(newConfig);
}
вызов onCreate() в onCofigurationChanged()
11 лет спустя ... для меня это были экземпляры эмулятора, работающие с API 28 и более поздними версиями, по умолчанию у которых «Автоповорот» был отключен (по какой-то причине). Это предотвращает поворот экрана.
Чтобы исправить это, вам нужно открыть панель управления эмулятором устройства и включить его:
У меня была та же проблема, и у меня были и "android:screenOrientation" и "android:configChanges", указанные в манифесте. Когда я удалил первый, onConfigurationChanged() вызывается при вращении. Странно но это просыпается)
У тебя есть android.content.res.Configuration
в ваших заявлениях на импорт? Eclipse может вставить импорт автоматически, если вы нажмете Ctrl+Shift+O
,
Если этого не произойдет, компилятор не сможет распознать, что вы законно переопределяете метод суперкласса, и поэтому выдаст ошибку.