Android TextInputLayouts потеряет текст/содержимое при возврате в транзакции фрагмента

99
8

Я искал какое-то время, но я думаю, что большинство зарегистрированных ошибок (и их довольно много) в android.support.design.widget.TextInputLayout немного отличаются от этого. По крайней мере, я решил большинство других ошибок, но бороться с этим.
В настоящее время у меня есть Fragment в моей работе с парой TextInputLayout, подобной этой


<android.support.design.widget.TextInputLayout
android:id="@+id/input1"
android:layout_width="match_parent"
android:layout_height="wrap_content">

<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/hint1"
android:inputType="numberSigned" />
</android.support.design.widget.TextInputLayout>

<android.support.design.widget.TextInputLayout
android:id="@+id/input2
android:layout_width="match_parent"
android:layout_height="wrap_content">

<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/hint2"
android:inputType="numberSigned"/>
</android.support.design.widget.TextInputLayout>

<android.support.design.widget.TextInputLayout
android:id="@+id/input3"
android:layout_width="match_parent"
android:layout_height="wrap_content">

<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/hint3"
android:inputType="numberSigned">
</android.support.design.widget.TextInputLayout>


И, после того, как вы встретите какое-то внешнее условие (не важно), я открываю и показываю другой фрагмент (100% экран), который скрывает вышеупомянутый фрагмент. Если вам интересно, этот новый фрагмент запрашивает некоторые дополнительные поля, которые мне нужны в этом конкретном случае.
Это код, который обрабатывает создание нового Fragment:


Fragment2 fragment2 = new Fragment2();
FragmentTransaction transaction = getActivity().getSupportFragmentManager().beginTransaction()
.replace(((ViewGroup) getView().getParent()).getId(), fragment2);
transaction.addToBackStack(Fragment1.class.getSimpleName());
transaction.commit();

НО проблема заключается в том, что при возврате (кнопка возврата назад, кнопка панели инструментов/кнопка действия и т.д.) к первому фрагменту. Все мои TextInputLayouts теряют текст, который был вставлен на них. Это действительно раздражает и не происходит при работе исключительно с EditText, как и в предыдущем нашем переходе Material Design.


Кроме того, этого не происходит, если вместо замены фрагментов с помощью FragmentTransaction я запускаю новый Activity. К сожалению, это не то, что мы действительно хотим. И нам не нужно будет делать такой подход.


Любые идеи? Это случилось с кем-то?

спросил(а) 2021-01-25T13:38:17+03:00 5 месяцев назад
1
Решение
99

Проводя свой "ответ", который действительно является обходным решением и может оказаться полезным или удовлетворительным для всех, но, по крайней мере, он мне очень помог.


Это явно ошибка с новым TextInputLayout, который не очень хорошо обрабатывает savedInstanceState при выполнении замены или удаления в FragmentTransaction. EditText сделал действительно хорошую работу ранее.


То, что я закончил, не использует FragmentTransaction#replace() (потому что я проследил проблему до удаления фрагмента), но вместо этого использовал комбинацию FragmentTransaction#hide() и FragmentTransaction#add(). Это дает точно такой же визуальный эффект и поведение и не имеет проблемы с упомянутой ошибкой. У этого есть только присущий недостаток, очевидно, не удаление фрагмента: ресурсы фрагмента не могут быть выпущены/использованы для других целей. Это может вызвать проблемы, если память коротка или ваш фрагмент является чудовищем. Но, по крайней мере, в моем случае это не вызвало никаких проблем.

Подводя итог, это то, что я, наконец, использую как транзакцию фрагмента:


Fragment2 fragment2 = new Fragment2();
FragmentTransaction transaction = getActivity().getSupportFragmentManager().beginTransaction();
transaction.add(((ViewGroup) getView().getParent()).getId(), fragment2);
transaction.hide(Fragment1.this);
transaction.addToBackStack(Fragment1.class.getSimpleName());
transaction.commit();

Надеюсь, это поможет некоторым из вас!

ответил(а) 2021-01-25T13:38:17+03:00 5 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема