Навигация фрагмента Android для планшетов - однократная или многократная работа?

Я хотел бы добиться такой навигации (рисунок ниже), где фрагменты A, B, C, D представляют собой навигацию по иерархии информации приложения.

На телефоне будет отображаться только один фрагмент, а на планшетах - два фрагмента.

Все учебники и документы, которые я видел (например this и this) укажите представление Master-Detail, где, кажется, есть главный фрагмент слева и подробный вид справа, но никто, кажется, не указывает, как глубже сверлить детали.

enter image description here

Фактически, приложение GMail для планшетов работает как мое собственное приложение. Скажем, что фрагмент A - список учетных записей и папок, фрагмент B - список электронных писем, а фрагмент C - сам разговор.

Этот экран представляет собой конфигурацию с фрагментами A и B enter image description here

Этот экран имеет фрагменты B и C enter image description here

Вопрос: должен ли я реализовать это с помощью одного действия, где

  • для телефонов у меня будет один FrameLayout для фрагментов
  • для таблиц у меня будет два FrameLayouts для "левого" и "правого" фрагмента?

Если да, то как я буду вставлять новые фрагменты? В FragmentTransaction у меня есть два доступных действия - add() и replace().

  • Если я использую add(), то фрагменты внизу кажутся живыми (они не входят в приостановленное состояние) и сохраняют свое полное состояние (но, по-видимому, теряют некоторые ресурсы) (так что в фрагменте D все C, B и A по-прежнему будет там), а на задней кнопке будет отображаться состояние прокрутки и загруженные данные.
  • Если я использую replace(), тогда предыдущий фрагмент будет удален, поэтому в любой момент будет только один (на телефоне) фрагмент сверху, а на обратной кнопке транзакция будет отменена, старый фрагмент добавлено назад, но оно не запомнит его предыдущее состояние.

Ни один из этих вариантов мне не подходит. В учебниках используется функция replace() в FragmentTransaction, но как они восстанавливают состояние предыдущего фрагмента, например, в приложении GMail для телефона фрагмент B загружается с сервера бесконечной прокруткой, а затем, когда я заменяю его фрагментом C и вернитесь назад, B должен появиться там, где он был остановлен, правильно?

Я действительно не знаю, что делать или где искать, пожалуйста, советую.

Ответ 1

использует только 1 активность, но с разными FragmentTransactions для каждого из них. Используйте LinearLayout в качестве корня вашей активности, позвоните ему R.id.content и создайте новые значения XML следующим образом:

  • /values/device.xml

    <item type="bool" format="boolean" name="isPhone">true</item>

  • /values-sw600dp/device.xml

    <item type="bool" format="boolean" name="isPhone">false</item>

то ваши транзакции будут такими:

  FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
  Frag_C f = new Frag_C();
  if(getResources().getBoolean(R.bool.isPhone)){ // phone
     ft.replace(R.id.content, f, Frag_C.TAG);
  }else { // tablet
     Fragment left = getSupportFragmentManager().findFragmentByTag(Frag_A.TAG);
     Fragment right = f;
     ft.hide(left);
     ft.add(R.id.content, right, FRAG_C.TAG);
  }
  ft.addToBackStack(null).commit();

и в качестве окончательной заметки при раздувании каждого фрагмента вы ДОЛЖНЫ установить параметры макета WEIGHT LinearLayout для управления шириной фрагментов. Что-то вроде этого:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
   View v = inflater.inflate(layoutId(), container, false);
   ((LinearLayout.LayoutParams) v.getLayoutParams()).weight = 1;
}

поэтому fragA weight будет 1, тогда B = 2, затем C = 4, а затем D = 8 (например). Таким образом, левый фрагмент будет иметь ширину 33%, а справа - 66%. Измените значения, которые вам нужны.

Если вы хотите знать, как оживить эти транзакции, обратитесь к этому ответу, который я дал ранее fooobar.com/questions/48785/...

Ответ 2

Я делаю некоторые исследования для вашего вопроса, я не думаю, что такая же процедура будет действительна для телефона и таблицы, но если это так, посмотрите:

        FragmentManager fragmentManager = getFragmentManager();
        fragmentManager.beginTransaction()
                .replace(R.id.frame_container, fragment).commit();

Это часть кода, ответственного за изменение фрагментов, Первоначально взято из Здесь

В этом руководстве есть все, чтобы выполнить планшетный план.

Я обращаюсь к этому сайту всякий раз, когда мне нужна помощь от андроида! Наслаждайтесь!!

Ответ 3

Как вы знаете, сегменты предназначены для повторного использования частей GUI.

Вперед я должен признать, что я не вижу примера кода или учебника, непосредственно обращающегося к сценарию A-B B-C C-D, но это происходит даже во всех действиях. Если в действии 1 можно использовать сегментный экземпляр B, так что активность 2 может иметь свой собственный экземпляр сегмента B. У вас будет дополнительное преимущество в том, что вы сможете напрямую ссылаться на активность 2 из других мест (и за пределами) вашего приложения.

Определите сегмент B за пределами действия 1 и используйте его как в A-B, так и в B-C. Затем startActivityForResult() активность 2, которая создает экземпляр другого сегмента B. Когда пользователь использует кнопку "Назад", они должны быть в действии 1 с последним состоянием своего сегмента B.

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