Почему фрагмент не может сохранить состояние EditText по умолчанию при изменении ориентации?

У меня есть фрагмент, который содержит много EditTexts. И когда я поворачиваю устройство, EditText становится пустым. Фрагмент не сохраняет свое состояние/значение. Но в то же время, если я использую этот макет фрагмента для активности, он сохраняет состояние EditText. И да, я дал идентификаторы каждому EditText, даже каждому представлению, если это имеет значение.

Я знаю, что могу использовать saveInstanceState для сохранения этих значений, но есть ли другой способ сделать это? Потому что в этом фрагменте почти 20 EdiText, поэтому я должен использовать saveInstanceState, можно ли будет сохранить эти многочисленные переменные/значения в saveInstanceState?

Обновление: я воссоздавал фрагмент в действии при изменении ориентации, поэтому EditText не смог сохранить свое состояние. Такая глупая ошибка! Итак, теперь я просто использовал saveInstanceState следующим образом:

if (savedInstanceState == null) {
        initialiseNewTaskFragment();
    }

Вот и все. EditText сейчас сохраняет свое состояние. Спасибо, ХорхеГил, за то, что сэкономил мое время!


person Parag Pawar    schedule 01.12.2017    source источник
comment
Можете ли вы опубликовать свой код, вероятно, вы воссоздаете фрагмент в активности по изменению конфигурации. Состояние EditText должно сохраняться при вращении, даже если вы используете фрагмент.   -  person Jorge Gil    schedule 01.12.2017
comment
Ну, это неудобно! @JorgeGil Ты прав, я воссоздавал фрагмент!! Я должен был знать это уже...   -  person Parag Pawar    schedule 01.12.2017


Ответы (2)


Ну, это довольно загруженный вопрос, лол. Итак, начнем с нескольких моментов.

Во-первых, вы, конечно, можете управлять своим собственным изменением жизненного цикла, если вы решите НЕ разрешать Android сбрасывать ваш жизненный цикл при смене устройства.

android:configChanges="orientation"

Используйте этот флаг в своем манифесте, если хотите сохранить все и обработать свои собственные изменения ротации. Однако, если у вас есть папка layout-land с разными XML-файлами, вам не нужно этого делать.

Да, конечно, вы можете сделать fragment.retainInstance, когда он вложен в Activity, чтобы сохранить значения. Тем не менее, сохранение заполненных элементов со значениями — это не то, что вы можете просто ожидать от него, поскольку элементы пользовательского интерфейса были полностью перерисованы, поэтому что-то должно сказать ему перерисовать его снова.

Итак, если вы придерживаетесь старой школы и на самом деле все еще используете findViewById и myText.setText('some Stuff'). Тогда вы можете сэкономить время, используя такую ​​библиотеку, как icepick.

https://github.com/frankiesardo/icepick

Тем не менее, ЛУЧШИЙ вариант — это модернизировать свою практику кодирования, чтобы использовать DataBinding. Это позволяет вам больше не заботиться о взаимодействиях с пользовательским интерфейсом, поскольку значения по умолчанию привязаны к вашим значениям Fragment, Activity или Model и могут быть выполнены с двусторонней привязкой. Это гарантирует, что привязка данных всегда заполняется последним обновленным значением.

Представьте, что у вас есть объект

public class Student implements BaseObservable{
     String firstName;
}

Тогда в вашем xml у вас есть

editText
    android:text="@={student.firstName}"

Очевидно, что есть еще кое-что, например, вам нужно установить объект ученика в onCreate, чтобы убедиться, что он находится в XML для использования. Но когда пользователь изменяет имя учащегося, оно сохраняется в модели и автоматически перерисовывается в текст редактирования.

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

Надеюсь, это поможет.

person Sam    schedule 01.12.2017
comment
Ну, проблема была в другом, но все равно спасибо за этот ответ. Однако я рассмотрю возможность использования DataBinding. Кажется, это отличный способ связать пользовательский интерфейс. - person Parag Pawar; 01.12.2017
comment
Как насчет того, чтобы дать немного больше контекста того, чего вы хотели бы достичь, и, возможно, кто-то может помочь. У меня такое чувство, что вы просто не хотите управлять состоянием, но не хотите использовать библиотеку, такую ​​​​как ледоруб или привязка, поэтому вы надеетесь просто установить флаг и уйти? Я дал все варианты, о которых я знаю, так что дайте мне знать, если вы обнаружите что-то еще - person Sam; 03.12.2017

Добавьте это в свой тег Activity на AndroidManifest.xml, чтобы избежать воссоздания Activity, и вы не потеряете данные.

  android:configChanges="orientation|screenSize"
person diegoveloper    schedule 01.12.2017