Вы ничего не упускаете (или я тоже это упускаю).
1002 * Я искал долго и упорно способ сделать это «правильно», но я не мог найти ничего.В итоге я написал свою собственную логику бэкстека.К сожалению, мой работодатель владеет моим кодом, поэтому я не могу поделиться ни одним из этих дословных слов, но вот мой подход:
Создайте enum
с одной записью для каждой из ваших вкладок.Давайте назовем это TabType
.Теперь создайте переменную экземпляра tabStacks
типа HashMap<TabType, Stack<String>>
.Теперь вы можете создать один стек для каждой вкладки - каждый стек представляет собой список тегов, как указано Fragment.getTag()
.Таким образом, вам не нужно беспокоиться о хранении ссылок на Fragments
и о том, исчезнут ли они на вас при повороте устройства.В любое время, когда вам нужна ссылка на Fragment
, возьмите правый тег со стека и используйте FragmentManager.findFragmentByTag()
.
Теперь, когда вы хотите вставить Fragment
на вкладку, сгенерируйте новый тег (Я использовал UUID.randomUUID().toString()
) и использовал его в своем звонке на FragmentTransaction.add()
.Затем нажмите на ярлык в верхней части стека для текущей отображаемой вкладки.
Будьте осторожны: , если вы хотите поместить новый фрагмент поверх старого, не remove()
старый, так как FragmentManager
будет считать, что он пропал, и он будет очищен.Обязательно detach()
это, а затем attach()
это позже.Используйте remove()
, только когда вы постоянно набираете Fragment
, и используйте add()
только в первый раз, когда вы хотите его показать.
Затем вам придется добавить относительно простую логику кваш TabListener
.Когда вкладка не выбрана, просто peek()
в ее стеке и detatch()
соответствующий фрагмент.Когда выбрана вкладка, peek()
вверху этой стопки и attach()
этого фрагмента.
Наконец, вам придется иметь дело с причудами жизненного цикла Activity (например, с изменением ориентации).).Сохраните Map
из Stacks
, а также текущую выбранную вкладку и снова распакуйте ее в onCreate()
.(Вы не получаете эту упаковку и распаковку бесплатно, но это довольно легко сделать.) К счастью, ваш TabType
enum равен Serializable
, поэтому его легко положить в Bundle
.