Клавиша «Назад» для вставки фрагмента показывает перекрывающиеся фрагменты - PullRequest
9 голосов
/ 23 июня 2011

Я создал пример приложения для проверки этой проблемы с перекрытием.

У меня есть тип фрагмента, Fragment1, и я создаю новый экземпляр Fragment1 и добавляю его в FrameLayout в своей деятельности во время выполнения.Я добавляю фрагмент с помощью нескольких кнопок.

Примечание. Каждому новому экземпляру Fragment1 я присваиваю свой номер (# 1, # 2, # 3 и т. Д.) Для отображения в пользовательском интерфейсе.помогите мне выяснить, какой фрагмент я просматриваю.

Итак ... вот что я делаю:

  1. Нажмите на кнопку 3, создайте новый экземпляр Fragment1 и добавьте его в Frame1.
  2. Нажмите кнопку 4, создайте новый экземпляр Fragment1, добавьте его в Frame1 и добавьте его в backstack фрагмента.
  3. Повторите 1 и 2.
  4. Повторите 1 и 2.

Теперь у меня есть фрагменты в следующем порядке: 1 (# 1), 2 (# 2), 1 (# 3), 2 (# 4), 1 (# 5), 2(# 6).

Я нажимаю клавишу «Назад» при просмотре фрагмента № 6.

  1. Нажатие клавиши «Назад», отображается пользовательский интерфейс (# 5).
  2. Кнопка «Назад»нажмите, пользовательский интерфейс отображает (# 3 и # 5),
  3. нажатие клавиши «Назад», пользовательский интерфейс отображает (# 1, # 3 и # 5)

Кажется, фрагменты отображаютсяНа вершине друг друга.

ПОЧЕМУ?Есть ли пересекающаяся проблема?Как я могу устранить эту проблему?Я думал, что это будет проблема с библиотекой совместимости ... но это также на 3.0.

Код для добавления фрагментов:

public int  doFragmentChange(int cont1, Fragment frag1, String tag1, int cont2, Fragment frag2, String tag2, 
            boolean addToStack, String stackTag) {
        FragmentManager fm = getFragmentManager();// getSupportFragmentManager();
        FragmentTransaction ft = fm.beginTransaction();
        if (frag1 != null) {
            ft.replace(cont1, frag1, tag1);
        }
        if (frag2 != null) {
            ft.replace(cont2, frag2, tag2);
        }
        // add fragment to stack
        if (addToStack)
            ft.addToBackStack(stackTag);
        return ft.commit();
    } 

Ответы [ 2 ]

1 голос
/ 20 марта 2012

Просто переопределите onBackPress() или onKeyUp и удалите верхний фрагмент.

1 голос
/ 24 июня 2011

Если вы выполняете два add вызова один за другим (два commit вызова), то да, фрагменты будут накладываться друг на друга, один поверх другого эффективно.

Итак (для нового примера), если, скажем, вы замените frag1 на frag2, а затем frag3 на frag4 в том же кадре без транзакции обратного стека, я бы ожидал, что frag2 и frag4 будут перекрыты.

Кроме того, существует также потенциальная проблема в вашей цепочке replace. Вы должны назвать отдельный commit для каждого. См. Android - Замена фрагмента обратно на новый стек? .

...