Я должен обработать изменения ориентации в своем приложении Android. С этой целью я решил использовать OrientationEventListener
класс удобства. Но его методу обратного вызова дают несколько странное поведение.
Мое приложение запускается в режиме портрета и затем в конечном счете переключается на lanscape один. У меня есть некоторый пользовательский код, выполняющийся в обратном вызове onOrientationChanged
метод, который обеспечивает некоторую дополнительную логику обработки UI - она имеет несколько вызовов к findViewById
. То, что является странным, то, что при переключении назад от среды до режима портрета onOrientationChanged
обратный вызов называют дважды, и что еще хуже - второй вызов имеет дело с плохо 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
без любой логики за исключением той, которая имеет дело с ориентацией hadling. Я инициирую переключатель ориентации от эмулятора Android 2.2 путем нажатия Ctrl+F11 What, могло быть неправильным?
Upd: Внутренний класс, который реализует OrientationEventListener
private class OrientationListener extends OrientationEventListener {
public OrientationL() {
super(getBaseContext());
}
@Override
public void onOrientationChanged(int orientation) {
toString();
}
}
}
Это задокументированная ошибка ТОЛЬКО в эмуляторе. Настоящее устройство не будет демонстрировать такое поведение двойных событий жизненного цикла. У меня была такая же проблема некоторое время назад, и она исчезает на реальном устройстве.
Я бы посоветовал проигнорировать проблему, если вы можете, проверяя изменения ориентации только в одном направлении, пока вы не получите в руки физический телефон. В противном случае вы можете «пропустить» второй набор вызовов жизненного цикла, сохранив статическое логическое значение, указывающее, что вы уже прошли первый набор.
См. этот отчет о проблеме для получения дополнительной информации.
Вы пробовали использовать onConfigurationChanged?
@Override
public void onConfigurationChanged(Configuration newConfig) {
if(newConfig.equals(Configuration.ORIENTATION_LANDSCAPE)…