Измененная конфигурация (изменение ориентации) и разрушающая деятельность - так ли это должно работать?

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

Первый вопрос Я действительно хочу знать у Android Team - почему? Я был бы признателен за объяснение того, как рассуждали, потому что я не получаю его =)

В любом случае тот факт, что он действует таким образом, ставит нас всех, как я вижу, в мир боли.

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

Как я вижу, вам нужен еще один класс "non-Activity" (или "value-hold" class), который имеет одно поле для каждого "элемента формы" (EditText, checkbox и т.д.),

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

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

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

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

Привет

Ответы

Ответ 1

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

Ответ 2

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

Ответ 3

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

В режиме сохранения - вы можете сохранить все, чтобы связать и прочитать его.

  @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 выше пару раз, пока жизненный цикл не станет кристально чистым.

Ответ 4

Подход

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

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

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

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

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