我有一个活动,管理4个片段。我想,当我向backStack添加一个片段时,它会从backStack中删除相同的片段(如果有的话),以便当时在backstack中只有一个片段。如果用户从A到B再到C,然后又回到B,则后堆栈看起来像:C,A而不是C,B,A。
我一直在寻找解决问题的方法,发现很多人都遇到了同样的问题。建议的解决方案是使用popBackStackImmediate(String, int)
,但是最大的问题是此函数会删除已弹出的堆栈顶部的堆栈。此行为似乎是不可更改的。因此,我想到了一个解决方案,该方案包括使用for循环在BackStack上运行,当片段的标记与BackStack中的片段的标记匹配时,将删除堆栈。我认为此堆栈是一个fragmentTransaction
,所以我想知道是否可以删除整个Fragment Transaction,以及如何删除?
private void setFragment(Fragment fragment) {
FragmentManager manager = getSupportFragmentManager();
String tagFromFragAddedToBackStack = getCurrentFragment().getTag();
String fragmentTag = fragment.getClass().getName();
String fragFromBackStackTag;
FragmentTransaction fragTransFromBackStack;
int i;
for ( i = 0; i < manager.getBackStackEntryCount() ; i++){
fragFromBackStackTag = manager.getBackStackEntryAt(i).getName();
fragTransFromBackStack = (FragmentTransaction) manager.getBackStackEntryAt(i);
fragFromBackStack = manager.findFragmentByTag(fragFromBackStackTag);
if (fragFromBackStackTag == fragmentTag){
// Here, I would like to delete the stack which matches
}
}
FragmentTransaction ft = manager.beginTransaction();
ft.replace(R.id.main_frame, fragment, fragmentTag);
ft.addToBackStack(tagFromFragAddedToBackStack);
ft.commit();
}
private Fragment getCurrentFragment(){
if (homeFragment.isVisible()){
return homeFragment;
}
else if (autonomyFragment.isVisible()) {
return autonomyFragment;
}
else if (shopFragment.isVisible()) {
return shopFragment;
}
else if (accountFragment.isVisible()) {
return accountFragment;
}
else
return null;
}