3

Поскольку версия поддержки 25.1.0 и последние 25.1.1 у меня странное поведение с заменой/добавлением фрагмента. За 25.1.0 Android - fragmentTransaction.replace() not works on support library 25.1.0Показ фрагмента popbackstack в 25.1.0 и 25.1.1

Но теперь в 25.1.1 у меня возникли аналогичные проблемы. Чтобы воспроизвести поведение, которое я создал пример приложения, которое вы можете найти на https://github.com/holoduke/fragmenttest

Это в основном одно действие с контейнером для фрагментов. Доступна пара фрагментов, которые будут динамически заменять друг друга, нажимая кнопку. Начнем с добавления FragmentA из mainActivity.

FragmentManager fm = getSupportFragmentManager(); 
    FragmentTransaction ft = fm.beginTransaction(); 

    Fragment f = new FragmentA(); 
    fm.popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); 
    f.setRetainInstance(false); 
    ft.replace(R.id.fragmenttarget, f); 
    ft.addToBackStack(null); 
    ft.commit(); 

Все хорошо Хорошо работает. в обоих 25.0.1, 25.1.0 и 25.1.1

Сейчас в Fragmenta есть 3 кнопки, которые все заменят текущий фрагмент либо Fragmenta, fragmentB или fragmentC

код для добавления фрагмента B и C почти такой же, как и фрагмент а, за исключением мы не определили:

fm.popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); 

, когда фрагмент в или С добавляют выполняется следующий код:

FragmentManager fm = getSupportFragmentManager(); 
    FragmentTransaction ft = fm.beginTransaction(); 

    Fragment f = new FragmentB(); 
    f.setRetainInstance(false); 
    ft.replace(R.id.fragmenttarget, f); 
    ft.addToBackStack(null); 
    ft.commit(); 

Тем не менее все хорошо и в 25.0.1, 25.1.0 и 25.1.1. Если вы добавите фрагмент B и C пару раз, то fm.getBackStackEntryCount() увеличивается. Это хорошо.

Теперь странная часть. Мы хотим добавить FragmentA с popStackImmediate (чтобы очистить историю) Здесь поведение обеих версий поддержки сходит с ума.

Допустим, что вы выполняете следующую bavhiour во всех 3-х вариантах:

  1. запуск приложения
  2. заменить фрагмент B
  3. заменить фрагмент C
  4. заменить фрагмент B
  5. заменить с фрагментом C
  6. заменить на фрагмент A

в версии 25.0.1 все работает отлично. backstack очищается, а onCreateView и ActivityCreated вызывается в FragmentA.

из 25.1.0 как-то после замены с помощью FragmentA onCreateView и ActivityCreated называются 2 раза. Нехорошо.

в 25.1.1 его еще хуже. после замены фрагментом A, для всех представлений в backstack вызывается onCreateView и ActivityCreated. Now Thats funny right :)

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

Я был бы рад, если кто-то сможет распознать эту проблему, поэтому мы можем найти способ преодолеть или даже решить эту проблему.

+0

Вы поменяете 'Fragment' на' Fragment'? Если это так, используйте 'getChildFragmentManager()' - просто нужно уточнить. –

+0

Не заменять его на MainActivity. см. https://github.com/holoduke/fragmenttest/blob/master/app/src/main/java/com/test/fragment/gillis/testfragment/MainActivity.java –

+1

Я подтверждаю, что при появлении фрагмента глубже в стек, все фрагменты между ними имеют свой onCreateView, указанный в 25.1.1. Это нарушило мое приложение, которое функционировало до обновления до 25.1.1. Снижение до 25.1.0 решило мою проблему. Однако моя замена похожа на A-> B-> C-> D, которая отличается от вашего примера, поэтому я, возможно, не столкнулся с проблемой, о которой вы говорили в 25.1.0. –

ответ

4

Ну, я столкнулся с той же проблемой и нашел решение, сравнив 25.0.1 -> 25.1.1 FragmentManager.class. Попробуйте использовать setAllowOptimization метод FragmentTransaction.