Обработка активности, вращающейся в Android - PullRequest
5 голосов
/ 25 сентября 2010

Мне нужно применять разные макеты для портретной и альбомной ориентации моей деятельности.Кроме того, мне нужно показать предупреждение, если ориентация портретная.

Я указал android:configChanges="orientation|keyboardHidden" в AndroidManifest.Я также переопределяю метод onConfigurationChanged следующим образом:

@Override
public void onConfigurationChanged(Configuration newConfig)
{
    Log.d("tag", "config changed");
    super.onConfigurationChanged(newConfig);

    int orientation = newConfig.orientation;
    if (orientation == Configuration.ORIENTATION_PORTRAIT)
        Log.d("tag", "Portrait");
    else if (orientation == Configuration.ORIENTATION_LANDSCAPE)
        Log.d("tag", "Landscape");
    else
        Log.w("tag", "other: " + orientation);

    ....
}

При повороте из альбомной в книжную ориентацию журнал выглядит так:

config changed
Portrait

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

config changed
Portrait
config changed
Landscape

Почему onConfigurationChanged вызывается дважды?Как я могу избежать этого?

Ответы [ 5 ]

3 голосов
/ 25 января 2013

См. Мой ответ на другой вопрос здесь: https://stackoverflow.com/a/3252547/338479

Короче говоря, корректно обрабатывать изменения конфигурации сложно.Лучше всего реализовать onRetainNonConfigurationInstance () , который вызывается непосредственно перед тем, как ваше приложение будет остановлено и перезапущено из-за изменения конфигурации.Используйте этот метод, чтобы сохранить все, что вы хотите («это» - хороший выбор), а затем позвольте системе разрушить ваше приложение.

Когда ваше приложение перезапустится с новой конфигурацией, используйте getLastNonConfigurationInstance () чтобы получить только что сохраненное состояние и использовать его для продолжения работы вашего приложения без всяких проблем с пакетами и общими настройками.

1 голос
/ 12 августа 2012

Вы можете просто сохранить предыдущую ориентацию и проверить, действительно ли она изменилась.

Если вы установите AndroidManifest.xml android:configChanges на keyboardHidden|orientation для своей деятельности, onCreate и т. Д. ... не будет вызываться Это значительно облегчает реализацию. Но, конечно, макет также изменится с портретного на ландшафтный.

0 голосов
/ 26 сентября 2010

Я уверен, что вы захотите использовать onCreate, а не onStart. Единственная разница заключается в том, что onStart будет вызываться, когда приложение выходит на передний план. Это не тот случай, когда вы захотите заставить пользователя ждать, пока вы повторно инициализируете пользовательский интерфейс. В противном случае просто измените ваш вызов setContentView, основываясь на этом условии if.

0 голосов
/ 26 сентября 2010

Android запускает новый экземпляр вашей активности при изменении ориентации, поэтому использование onCreate является идеальным методом.Вам, очевидно, придется сохранять / восстанавливать данные своей активности, чтобы определить, где вы остановились - но вы должны делать это в любом случае, поскольку любое количество событий может расфокусировать / убить ваше приложение.

0 голосов
/ 25 сентября 2010

Есть ли какая-то особая причина, по которой вы решили управлять вращением таким образом?Хотя это происходит быстрее, поскольку действие не возобновляется при изменении ориентации, обычно это не рекомендуется, если я правильно помню.Другой способ обработки изменений ориентации - вместо переопределения onConfigurationChanged(), переопределения onCreate(), onStart() или onResume() таким, что

@Override
public void onStart() {
    super.onStart();
    int orientation = getWindowManager().getDefaultDisplay().getOrientation();
    if(orientation == Configuration.ORIENTATION_PORTRAIT) {
        Log.i(TAG, "Orientation is portrait");
        // show whatever alerts here
    }
}

, а затем указание двух макетов - одного для портрета, одного для ландшафта,Портретная версия макета останется на res/layout/whatever.xml, а альбомная версия будет на res/layout-land/whatever.xml.AndroidGuys написал кучу хороших статей на эту тему, см. http://androidguys.com/?s=rotational+forces&x=9&y=9

...