Конфигурация изменена (изменение ориентации) и уничтожает действия - так ли это должно работать? - PullRequest
17 голосов
/ 09 января 2010

Я прочитал о том, как Android обрабатывает «изменения конфигурации» - уничтожая активную активность.

Я действительно хочу узнать от Android Team, почему это так. Я был бы признателен за объяснение того, как шли рассуждения, потому что я не понимаю его. Тот факт, что он действует таким образом, ставит нас всех, как я вижу, в мир боли.

Предположим, что у вас есть действие, которое представляет собой набор EditText: s, флажки и т. Д. Если пользователь начинает заполнять эту форму текстом / данными, а затем меняет ориентацию (или получает телефонный звонок), то все вводимые пользователем данные ушел Я не нашел способа сохранить государство. Это заставляет нас делать чрезвычайно болезненное кодирование, чтобы не потерять все данные.

На мой взгляд, вам нужен еще один класс «не-Activity» (или «удерживающий значение» класс возможно), который имеет одно поле для каждого «элемента формы» (EditText, флажок и т. Д.).

Для каждого существующего «элемента формы» вам необходимо присоединить событие типа «onChanged» (или onTextChanged или что-то в этом роде), которое обновляет соответствующее поле в классе «значение-значение» чтобы быть уверенным, что для каждого введенного вами символа (например, в EditText) сохраняется сразу.

Возможно, вы можете использовать некоторый слушатель (например, «onDestroy» или что-то в этом роде), а затем заполнить класс, содержащий значения, данными.

Я также нашел эту информацию , где они говорят об использовании Bundle, onSaveInstanceState и onRestoreInstanceState , но это также означает, что программист должен вручную сохранить, а затем позже вернуть значения в правильное место? Этот подход немного менее сложен, чем мои предложения выше, но все же не очень хорош.

Может ли кто-нибудь сказать мне, что я совершенно неправ, и что это не так, и что я полностью пропустил некоторую жизненно важную информацию?

Ответы [ 4 ]

11 голосов
/ 09 января 2010

Вы должны прочитать Основы применения (в частности, Жизненный цикл активности ). Так как Activity s должен иметь возможность обрабатывать уничтожение в любое время из-за ограничений памяти и т. Д., Это просто более чистый способ обработки вращений без добавления слишком большой сложности - вместо проверки каждого ресурса на альтернативный ресурс, реструктуризация макет и т. д. вы просто сохраняете необходимые данные, уничтожаете действие, воссоздаете его и загружаете данные обратно (если вы готовы справиться с дополнительной сложностью управления этим самостоятельно, вы можете использовать onConfigurationChanged для справьтесь с изменением конфигурации самостоятельно.) Это также поощряет лучшие практики - разработчики должны быть готовы к тому, что их Activity будут убиты за изменение ориентации, что имеет (хорошее) следствие того, что они также были готовы к уничтожению из-за ограничений памяти.

4 голосов
/ 09 января 2010

Содержимое EditText будет автоматически сохраняться для вас при повороте экрана, если вы добавите на него атрибут android: id. Точно так же, если вы отображаете диалоги, используя Activity # showDialog, тогда диалоги отображаются для вас после поворота.

3 голосов
/ 09 января 2010

о том, почему часть - короткий ответ - потому что у вас могут быть ресурсы, которые необходимо было изменить при повороте телефона. (Изображения, макет может отличаться и т. Д.)

При сохранении - вы можете сохранить ваши вещи в связке и прочитать их обратно.

  @Override
    protected void onSaveInstanceState(Bundle outState) {

            String story_id = "123"
            outState.putString(ContentUtils.STORYID, story_id);

    }

или вы можете использовать onRetainNonConfigurationInstance (), как описано здесь http://developer.android.com/reference/android/app/Activity.html#onRetainNonConfigurationInstance()

Наконец, если у вас нет ничего, с чем вы хотите справиться во время вращения - вы можете проигнорировать это вложив это в свою деятельность в манифесте

android:configChanges="keyboardHidden|orientation"

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

0 голосов
/ 21 сентября 2012

@ Подход Алекса, приведенный выше, показал мне действительно полезное решение при использовании фрагментов:

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

setRetainInstance(true); в конструкторе (ах) фрагмента

Это приведет к тому, что фрагменты будут сохранены во время изменения конфигурации.

http://developer.android.com/reference/android/app/Fragment.html#setRetainInstance(boolean)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...