Я пытаюсь понять, как сохранить состояние представления фрагмента, когда фрагменты используются в навигационных вкладках. В моих усилиях я столкнулся с двумя проблемами, из-за которых я не могу найти правильных решений.
У меня есть две вкладки: Tab1 и Tab2. Макет Tab1 определяется макетом FragmentA и Tab2, определяемым FragmentB. Я следил за приведенным здесь подходом: Добавление вкладок навигации
Первая проблема: Несмотря на то, что у моих представлений есть идентификаторы, их состояния не восстанавливаются полностью, когда фрагмент повторно подключен (после поворота переключателя табуляции). В частности: EditText с идентификатором действительно сохраняет свой введенный текст, но НЕ сохраняет его разрешенный статус. Также мои кнопки не сохраняются, если они включены или отключены, даже если у них есть идентификаторы. Я нашел два возможных решения этой проблемы:
- При переключении вкладок используйте
hide()/show()
вместоattach()/detach()
. - in
onPause()
сохранить текущее состояние представления фрагмента в переменной экземпляраView
фрагмента черезgetView()
. ВonCreateView(Bundle savedInstanceState)
проверьте, не пустое это поле, и если это так, верните значение этого поля. Это решение кажется взломанным, и мне сказали, что он может также ввести утечку памяти в моем приложении.
Вторая проблема: Рассмотрим следующее взаимодействие с пользователем:
Пользователь запускается в Tab1 и выполняет некоторые изменения, которые ставят состояние представления Tab1 в другое состояние, чем его состояние по умолчанию (и мы хотим, чтобы фрагмент сохранял это состояние просмотра с помощью табуляции и наклона устройства).
Затем пользователь переходит к Tab2. Затем пользователь наклоняет свое устройство (все еще на Tab2).
Затем пользователь переходит на Tab1 (при новой ориентации экрана).
Теперь проблема заключается в следующем: когда пользователь изначально переходит из Tab1 в Tab2, фрагмент отсоединяется и, следовательно, его отбрасывается (хотя экземпляр фрагмента все еще живет). Когда пользователь затем наклоняет устройство, действие - и, тем самым, и FragmentA, и FragmentB, связанные с ним, - уничтожаются. Поскольку FragmentA в этот момент больше не имеет представления (помните: он был отсоединен), мы не можем сохранить состояние его элементов вида (например, какие кнопки включены/отключены) во время вызова FragmentA.onSaveInstanceState(Bundle savedInstanceState)
. Как восстановить состояние представления фрагмента в такой ситуации? Является единственным жизнеспособным решением для сохранения каждого отдельного элемента представления различных флагов статуса как SharedPreferences? Это кажется слишком сложным для такой "повседневной работы".
Я был повсюду в SO и в разных блогах, но не смог найти решение этой (конкретной) проблемы.