Поскольку версия поддержки 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-х вариантах:
- запуск приложения
- заменить фрагмент B
- заменить фрагмент C
- заменить фрагмент B
- заменить с фрагментом C
- заменить на фрагмент 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, чтобы увидеть различия.
Я был бы рад, если кто-то сможет распознать эту проблему, поэтому мы можем найти способ преодолеть или даже решить эту проблему.
Вы поменяете 'Fragment' на' Fragment'? Если это так, используйте 'getChildFragmentManager()' - просто нужно уточнить. –
Не заменять его на MainActivity. см. https://github.com/holoduke/fragmenttest/blob/master/app/src/main/java/com/test/fragment/gillis/testfragment/MainActivity.java –
Я подтверждаю, что при появлении фрагмента глубже в стек, все фрагменты между ними имеют свой onCreateView, указанный в 25.1.1. Это нарушило мое приложение, которое функционировало до обновления до 25.1.1. Снижение до 25.1.0 решило мою проблему. Однако моя замена похожа на A-> B-> C-> D, которая отличается от вашего примера, поэтому я, возможно, не столкнулся с проблемой, о которой вы говорили в 25.1.0. –