Android onConfigurationChanged () не вызывается в Activity - PullRequest
8 голосов
/ 15 июня 2011

Я понимаю, что есть еще несколько сообщений на эту тему, но решения для этих сообщений не работают для меня.

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

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

и я переопределил onConfigurationChanged() в своей активности:

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);

    System.out.println("IN onConfigurationChanged()");
}

Однако, действие все еще возобновляется после изменения ориентации, и метод onConfigurationChanged() не вызывается.

Кто-нибудь знает, почему это может происходить?

Ответы [ 8 ]

8 голосов
/ 25 октября 2012

Вы должны использовать 13 API и установить эту конфигурацию в части манифеста своей деятельности: android: configChanges = "direction | keyboardHidden | screenSize"

Работает нормально.На всех версиях Android.

2 голосов
/ 29 марта 2013

Измените свой манифест на следующий

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

и обратитесь по этой ссылке для подробного объяснения вопрос ориентации

1 голос
/ 23 ноября 2011

Вы не должны использовать setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);вызов метода в любом месте вашего приложения позволит избежать вызова метода onConfigChanged ().

1 голос
/ 23 июня 2011

Единственное, что сработало, это использование getLastNonConfigurationInstance ().http://developer.android.com/reference/android/app/Activity.html#getLastNonConfigurationInstance()

0 голосов
/ 06 декабря 2012

Я использовал это, и это помогло:

package="com.s2dio.evallet"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="8" />
0 голосов
/ 30 октября 2012

если у вас есть фрагмент, то вам также нужно это:

void setRetainInstance(boolean retain) 

Контроль, является ли фрагмент экземпляр сохраняется во время повторного создания действия (например, из изменение конфигурации).

Я столкнулся с этим и установил значение 'true', исправил это.

0 голосов
/ 26 февраля 2012

Модифицируйте ваш onConfigurationChanged метод на следующий

public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    // Checks the orientation of the screen
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
        Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();
    } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
        Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();
    }
}
0 голосов
/ 15 июня 2011

если вы определили configchanges = direction в вашем манифесте, то действие не будет перезапущено, но вместо этого будет вызываться onConfigurationChanged, поскольку вы в настоящее время его реализовали. Сначала попробуйте зарегистрировать это с помощью класса log (это правильный способ входа в систему Android, не используйте System для этого, это считается плохой практикой), и перед супер, но это всего лишь 1% шанс, что он исправит то, что происходит с вами.

Во втором случае у вас есть текущее действие, вложенное, например, в tabHost или группу действий. если ваша активность имеет родительскую активность, то в нее необходимо добавить изменение конфигурации, и обратный вызов произойдет там.

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

...