Фрагмент сохраняется после удаления?
1 Добавьте два фрагмента в FragmentManager
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft1 = fm.beginTransaction();
ft1.add(containerId, fragment1, "fragment1");
ft1.addToBackStack(null);
ft1.commitAllowingStateLoss();
FragmentTransaction ft2 = fm.beginTransaction();
ft2.add(containerId, fragment2, "fragment2");
ft2.addToBackStack(null);
ft2.commitAllowingStateLoss();
2 Измените настройку мобильного устройства Параметры разработчика- > Не выполнять действия- > ВКЛ
3 Удалите все фрагменты после воссоздания активности
FragmentTransaction ft3 = fm.beginTransaction();
for(Fragment f : fm.getFragments()) ft3.remove(f);
ft3.commitAllowingStateLoss();
Мой вопрос в том, почему fm.findFragmentByTag( "fragment1" ) не является нулевым после удаления?
minSdkVersion 17
targetSdkVersion 22
compileSdkVersion 22
Ответы
Ответ 1
попробуйте этот код для удаления фрагмента
FragmentManager manager = getActivity().getSupportFragmentManager();
FragmentTransaction trans = manager.beginTransaction();
trans.remove(myFrag);
trans.commit();
manager.popBackStack();
Я думаю, вы не добавили этот метод
manager.popBackStack();
или
getSupportFragmentManager().popBackStack()
Ответ 2
используйте opBackStackImmediate()
вместо popBackStack()
, который немедленно закроет фрагмент из backstack. метод удаления трансекции не удаляет фрагмент из backstack его только для перерезки.
Ответ 3
вместо
ft1.add(containerId, fragment1, "fragment1");
попробуйте
ft1.replace(containerId, fragment1, "fragment1");
и используйте
fragmentmanager.popBackStack();
Ответ 4
вы должны commit
удалить отдельные фрагменты транзакций.
этот код завершит завершение цикла
for(Fragment f : fm.getFragments()) ft3.remove(f);
ft3.commitAllowingStateLoss();
вместо использования brackets
for(Fragment f : fm.getFragments()){
ft3.remove(f);
ft3.commitAllowingStateLoss();
}
Ответ 5
Попробуйте это...
List<Fragment> list = getSupportFragmentManager().getFragments();
if (list == null) {
Log.e("TAg", "No existing fragments" );
}
for (Fragment frag : list)
{
// To save any of the fragments, add this check.
// A tag can be added as a third parameter to the fragment when you commit it
if (frag.getTag().equals("tag-name")) {
continue;
}
getSupportFragmentManager().beginTransaction().remove(frag).commit();
}
Ответ 6
public void popAll() {
if (mFragmentManager != null) {
if (!mOnPause && mFragmentManager.getBackStackEntryCount() > 0) {
if (isFragmentOnStack(HomeFragment.TAG_NAME))
mFragmentManager.popBackStackImmediate(HomeFragment.TAG_NAME, 0);
else
mFragmentManager.popBackStackImmediate(null,
FragmentManager.POP_BACK_STACK_INCLUSIVE);
} else if (mFragmentManager.getBackStackEntryCount() > 0) {
mTransactionList.clear();
mTransactionList.add(new FragmentPopAll());
}
}
}
Ответ 7
У меня была такая же проблема. Я удалил фрагмент с помощью тега следующим образом:
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction ft = fragmentManager.beginTransaction();
Fragment fragment = fragmentManager.findFragmentByTag("fragment1");
ft.remove(fragment);
ft.commit();
Теперь findFragmentByTag()
должен вернуть findFragmentByTag()
Ответ 8
Используйте метод commitNow
вместо commitAllowingStateLoss
, поскольку он выполняет транзакцию синхронно