Android onConfigurationChanged не вызывается - PullRequest
39 голосов
/ 23 июня 2011

У меня проблемы с сообщением Android, чтобы он не звонил onCreate() при изменении ориентации.Я добавил android:configChanges="orientation" в мой манифест, но все же, когда меняется ориентация, вызывается onCreate().Вот мой код.

AndroidManifest.xml

<activity android:name="SearchMenuActivity" android:theme="@android:style/Theme.NoTitleBar" android:configChanges="orientation"></activity>

SearchMenuActivity.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

Кто-нибудьзнаете, что я делаю не так?Спасибо.

Ответы [ 8 ]

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

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

Внимание! Начиная с 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» для android: configChanges = «direction» для API 14 +

56 голосов
/ 23 июня 2011

Несколько вещей, чтобы попробовать:

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

РЕДАКТИРОВАТЬ: Как отметил Деррик, я предположил, что вы меняли конфигурацию с акселерометром, определяющим, с какой стороны устройство смотрит. Если вы хотите, чтобы конфигурация изменялась при отображении / скрытии клавиатуры, configChanges в манифесте также должен включать keyboardHidden.

10 голосов
/ 17 января 2013

Попробуйте использовать это .....

android:configChanges="orientation|keyboardHidden|screenSize"
5 голосов
/ 23 июня 2011

Вы должны изменить запись configChanges в AndroidManifest.xml на:

android:configChanges="keyboardHidden|orientation"

В противном случае, скольжение клавиатуры не вызывает onConfigurationChange (), даже если ориентация меняется. Я только что проверил это на своем HTC Desire Z.

4 голосов
/ 29 июля 2013

Добавьте это в свой манифест к каждому действию.

android:configChanges="keyboardHidden|orientation|screenSize"

Затем переопределите onConfigurationChanged для своей активности как таковой

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
}
1 голос
/ 30 октября 2015

Манифест:

<activity
      android:name=".MainActivity"
      android:configChanges="orientation|keyboardHidden|screenSize">
</activity>

Активность и фрагмент:

@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
1 голос
/ 23 февраля 2015

Это не сработало в моем Fragment (Fragments не зарегистрированы в AndroidManifest.xml), поэтому мне пришлось переместить его в Activity, управляющий моим Fragment, в моем случае TabsPagerActivity.

0 голосов
/ 23 февраля 2018

Мало что может быть перепроверено:

В моем случае я отслеживал смену языка устройства с помощью onConfigurationChanged.

Немного вещей нужно знать о onConfigurationChanged isЕсть некоторая разница в поведении между onConfigurationChanged из Activity и Application.

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

и другоевещь только в локали в манифесте не будет работать когда-нибудь. Итак, вы объявили другое событие изменения конфигурации вместе с локалью (в моем случае), которая должна выглядеть как android: configChanges = "layoutDirection | locale"

...