Android onConfigurationChanged: как сохранить и восстановить фрагмент стека назад? - PullRequest
8 голосов
/ 03 апреля 2012

У меня есть действие с двойной панелью: список пунктов меню слева (фрагмент M) и подробная информация о текущем выбранном элементе справа (фрагмент D).

Когда пользователь выбираетэлемент во фрагменте D, фрагмент D заменяется другим фрагментом (назовем его D1).Когда пользователь выбирает элемент во фрагменте D1, фрагмент D1 заменяется другим фрагментом (назовем его D2) и так далее.Конечно, когда пользователь нажимает кнопку «Назад», он может вернуться в историю фрагментов: D2-> D1-> D.

Моя проблема заключается в следующем: как сохранить и восстановить полный стек фрагментов при конфигурацииизменить (в частности, на ориентацию экрана)?

Мне кажется очень странным, что у кого-то еще не было этой проблемы раньше, но я не нашел ничего об этом во время моих поисков в Google и переполнении стека.Если я пропустил какой-либо соответствующий пост, пожалуйста, обратитесь к нему.

Я знаю, что мог бы просто добавить атрибут android:configChanges="orientation|screenSize" к своей активности, чтобы избежать активного отдыха, но я просто не могу этого сделать.

Причина, по которой я не могу этого сделать, заключается в том, что я использую Action Bar Sherlock (версия 4) для обратной совместимости, и этот компонент нуждается в воссоздании активности для правильного поведения при изменении конфигурации, AFAIK.

Если есть другой способчтобы воссоздать компонент «Шерлок панели действий» без разрушения и воссоздания упражнения, пожалуйста, сообщите мне.

Заранее спасибо.

Ответы [ 2 ]

5 голосов
/ 06 апреля 2012

Я смог сделать это, кэшировав фрагменты, так как добавил их в свой собственный ArrayList. Затем я настроил OnBackStackChangedListener для отслеживания того, какой из них был показан, и при необходимости выскочил из ArrayList.

Моя цель была немного другой, но код ниже должен быть тем, что вам нужно для того, что вы описываете. Теги, так что вы можете иметь несколько стеков назад, если вам нужно. Он не скомпилируется как есть (я вырезал много собственного кода), но должен дать вам представление о том, как я это сделал. Дополнительный отказ от ответственности: у меня просто получилось, и могут быть проблемы, с которыми я еще не столкнулся.

   public void replaceFragmentWithBackStackForTag(Fragment fragment, String tag)
   {
      FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
      ft.detach(visibleFragment);
      ft.add(R.id.realtabcontent, fragment, tag);
      ft.attach(fragment);
      ft.addToBackStack(null);
      manualBackStacks.get(tag).add(fragment);
      ft.commit();
      this.getSupportFragmentManager().executePendingTransactions();
   }

Код, который вам понадобится для восстановления вашей активности после изменения ориентации:

 ArrayList<Fragment> backStack =
       new ArrayList<Fragment>(manualBackStacks.get(tag));
 popArrayListToIndex(manualBackStacks.get(tag), 0); // helper I wrote
 for (int bs = 1; bs < backStack.size(); bs++) {
    replaceFragmentWithBackStackForTag(backStack.get(bs), tag);
 }

Слушатель backstack:

 public void onBackStackChanged() {
    int index = getSupportFragmentManager().getBackStackEntryCount();
    ArrayList<Fragment> backStack = manualBackStacks.get(tag);
    visibleFragment = backStack.get(index);
    // Pop the last element if we've backed up.
    popArrayListToIndex(backStack, index);
 }

Надеюсь, это поможет.

0 голосов
/ 04 апреля 2012

Action Bar Sherlock (ABS) необходим для воссоздания панели действий как части воссоздания активности в ABS 3.x, но согласно @ комментарию Джейка Уортона , версия 4 не нуждается в воссоздании - онаможет обрабатывать изменения ориентации.Итак, установите android: configChanges = "direction" и ваш стек обратно будет сохранен.

...