Android onConfigurationChanged не вызывается
У меня возникли проблемы с сообщением Android, чтобы он не вызывал onCreate()
когда меняется ориентация. Я добавил android:configChanges="orientation"
в мой манифест, но все же, когда onCreate()
изменение ориентации на onCreate()
. Вот мой код.
AndroidManifest.xml
SearchMenuActivity.java
- Java: Как установить точность для двойного значения?
- Android Horizontal LinearLayout - Элементы обертки
- Почему методы переопределения не могут исключать исключения, кроме переопределенного метода?
- Почему не конечная «локальная» переменная не может использоваться внутри внутреннего classа, и вместо этого может использоваться не конечное поле охватывающего classа?
- Включить Enum в Java
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Set the current layout to the search_menu setContentView(R.layout.search_menu_activity); Log.d(TAG, "onCreate() Called"); } @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); }
И мой выход LogCat
06-23 12:33:20.327: DEBUG/APP(2905): onCreate() Called //Orientation Changes 06-23 12:33:23.842: DEBUG/APP(2905): onCreate() Called
Кто-нибудь знает, что я делаю неправильно? Благодарю.
- Как получить случайную строку текстового файла в Java?
- создание Hashmap из строки JSON
- Приемник как внутренний class в Android
- Как удалить все обратные вызовы из обработчика?
- Поиск в Android с помощью fragmentов
- Как сравнить два дата без временной части?
- Не удалось создать Android Virtual Device
- Ошибка соединения Bluetooth "java.io.IOException: чтение не выполнено, сокет может быть закрыт или таймаут, read ret: -1"
Несколько вещей, чтобы попробовать:
android:configChanges="orientation|keyboardHidden|screenSize"
а не android:configChanges="orientation"
Убедитесь, что вы не вызываете setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
в любом месте. Это приведет к тому, что onConfigurationChange () не будет срабатывать.
Убедитесь, что вы не используете android:screenOrientation
в манифесте.
Если это не работает, прочитайте в документе Android о обработке изменений времени выполнения и убедитесь, что вы все делаете правильно. В вашем коде может быть что-то еще, что вызывает проблему. http://developer.android.com/guide/topics/resources/runtime-changes.html
EDIT: Как заметил derrik, я предположил, что вы меняли конфигурацию с помощью акселерометра, определяющего, каким образом устройство сталкивается. Если вы хотите, чтобы конфигурация изменилась по мере того, как клавиатура отображается / скрыта, configChanges в манифесте также должны включать в себя keyboardHidden
.
Это был мой гремлин по той же проблеме:
Внимание: Начиная с Android 3.2 (уровень API 13), «размер экрана» также изменяется, когда устройство переключается между портретной и альбомной ориентацией. Таким образом, если вы хотите предотвратить перезапуск во время изменения ориентации при разработке для уровня API 13 или выше (как объявлено атрибутами minSdkVersion и targetSdkVersion), вы должны включить значение «screenSize» в дополнение к значению «ориентация». То есть, вы должны декалировать android: configChanges = “orientation | screenSize”. Однако, если ваше приложение нацелено на уровень API 12 или ниже, ваша деятельность всегда обрабатывает это изменение самой конфигурации (это изменение конфигурации не перезапускает вашу активность даже при работе на устройстве Android 3.2 или выше).
(Из http://developer.android.com/guide/topics/resources/runtime-changes.html )
TL; DR: добавить «| screenSize» в android: configChanges = «ориентация» для API 14+
Попробуйте использовать этот …
android:configChanges="orientation|keyboardHidden|screenSize"
Вы должны изменить запись configChanges в AndroidManifest.xml, чтобы:
android:configChanges="keyboardHidden|orientation"
В противном случае сдвиг клавиатуры не будет срабатывать в режимеConfigurationChange (), даже если ориентация изменится. Я просто проверил это на своем HTC Desire Z.
Добавьте это в свой манифест к каждому действию.
android:configChanges="keyboardHidden|orientation|screenSize"
Затем переопределите onConfigurationChanged
в вашей деятельности как таковой
@Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); }
Это не срабатывало в моем Fragment
( Fragments
не зарегистрированы в AndroidManifest.xml
), поэтому мне пришлось перенести его в Activity
TabsPagerActivity
my Fragment
, в моем случае TabsPagerActivity
.
Manifest:
Размер
Активность и fragment:
@Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); Log.d(TAG, "onConfigurationChanged " + (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE ? "landscape" : "portrait")); }
Вывод:
10-29 21:53:26.951 D/FragmentOne: onConfigurationChanged landscape 10-29 21:53:26.951 D/MainActivity:onConfigurationChanged landscape
Немногие вещи могут быть перекрестной проверкой:
В моем случае я отслеживал изменение языка устройства с помощью onConfigurationChanged.
Немногие вещи, которые нужно знать о onConfigurationChanged, есть некоторая разница в поведении между onConfigurationChanged of Activity и Application.
Когда вы меняете конфигурацию устройства, уровень приложения onConfigurationChanged будет вызываться автоматически и немедленно, но onConfigurationChanged of activity будет вызывать, когда вы переходите к этой активности.
и еще одна вещь – только локаль в манифесте не будет работать. Так что вы объявляете другое событие изменения конфигурации вместе с языковой версией (в моем случае), которая должна быть как android: configChanges = “layoutDirection | locale”