Я хотел бы добиться такой навигации (рисунок ниже), где фрагменты A, B, C, D представляют собой навигацию по иерархии информации приложения.
На телефоне будет отображаться только один фрагмент, а на планшетах - два фрагмента.
Все учебники и документы, которые я видел (например this и this) укажите представление Master-Detail, где, кажется, есть главный фрагмент слева и подробный вид справа, но никто, кажется, не указывает, как глубже сверлить детали.
Фактически, приложение GMail для планшетов работает как мое собственное приложение. Скажем, что фрагмент A - список учетных записей и папок, фрагмент B - список электронных писем, а фрагмент C - сам разговор.
Этот экран представляет собой конфигурацию с фрагментами A и B
Этот экран имеет фрагменты B и C
Вопрос: должен ли я реализовать это с помощью одного действия, где
- для телефонов у меня будет один FrameLayout для фрагментов
- для таблиц у меня будет два FrameLayouts для "левого" и "правого" фрагмента?
Если да, то как я буду вставлять новые фрагменты? В FragmentTransaction у меня есть два доступных действия - add()
и replace()
.
- Если я использую
add()
, то фрагменты внизу кажутся живыми (они не входят в приостановленное состояние) и сохраняют свое полное состояние (но, по-видимому, теряют некоторые ресурсы) (так что в фрагменте D все C, B и A по-прежнему будет там), а на задней кнопке будет отображаться состояние прокрутки и загруженные данные. - Если я использую
replace()
, тогда предыдущий фрагмент будет удален, поэтому в любой момент будет только один (на телефоне) фрагмент сверху, а на обратной кнопке транзакция будет отменена, старый фрагмент добавлено назад, но оно не запомнит его предыдущее состояние.
Ни один из этих вариантов мне не подходит. В учебниках используется функция replace() в FragmentTransaction, но как они восстанавливают состояние предыдущего фрагмента, например, в приложении GMail для телефона фрагмент B загружается с сервера бесконечной прокруткой, а затем, когда я заменяю его фрагментом C и вернитесь назад, B должен появиться там, где он был остановлен, правильно?
Я действительно не знаю, что делать или где искать, пожалуйста, советую.