Проблемы при обработке ориентации - PullRequest
5 голосов
/ 07 июня 2010

Мне нужно обрабатывать изменения ориентации в моем приложении Android. Для этого я решил использовать OrientationEventListener удобный класс. Но его метод обратного вызова имеет несколько странное поведение.

Мое приложение запускается в портретном режиме, а затем в конечном итоге переключается на Lanscape. У меня есть некоторый пользовательский код, выполняемый в методе обратного вызова onOrientationChanged, который обеспечивает некоторую дополнительную логику обработки пользовательского интерфейса - у него есть несколько вызовов findViewById. Странно то, что при переключении из альбомного в портретный режим onOrientationChanged обратный вызов вызывается дважды, и что еще хуже - второй вызов имеет дело с bad Context - findViewById метод начинает возвращаться null. Эти звонки осуществляются прямо из MainThread

    @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    listener = new OrientationListener();
}

    @Override
protected void onResume() {     
    super.onResume();
    // enabling listening
    listener.enable();
}
    @Override
protected void onPause() {
    super.onPause();
    // disabling listening
    listener.disable();
}

Я повторил то же поведение с манекеном Activity без какой-либо логики, кроме той, которая касается ориентации хедлинга. Я запускаю переключатель ориентации из эмулятора Android 2.2, нажимая Ctrl + F11 Что может быть не так?

Upd: Внутренний класс, который реализует OrientationEventListener

private class OrientationListener extends OrientationEventListener {
    public OrientationL() {
        super(getBaseContext());
    }

    @Override
    public void onOrientationChanged(int orientation) {

        toString();

    }
}

}

Ответы [ 3 ]

5 голосов
/ 08 июня 2010

Это задокументированная ошибка ТОЛЬКО в эмуляторе.Реальное устройство не будет демонстрировать такое поведение событий двойного жизненного цикла.У меня была такая же проблема некоторое время назад, и она исчезает на реальном устройстве.

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

См. этот отчет о проблеме Информация.

3 голосов
/ 07 июня 2010

Вы пробовали использовать onConfigurationChanged?

@Override
public void onConfigurationChanged(Configuration newConfig) {
 if(newConfig.equals(Configuration.ORIENTATION_LANDSCAPE)…
1 голос
/ 10 ноября 2010

Добавить android: configChanges = "direction" в файле манифеста в теге активности, например

<activity android:label="@string/app_name" android:configChanges="orientation" android:name=".com.androidpeople">

...