尝试避免将相同片段添加到 backStack 两次,popBackStackImmediate 总是 return false
Trying avoid add same fragment twice to backStack, popBackStackImmediate always return false
我正在尝试避免使用此方法将相同的片段添加到 backStack:
public static void replaceFragment(FragmentManager fragmentManager, Fragment fragment, Boolean addToBackStack) {
String backStateName = fragment.getClass().getName();
boolean fragmentPopped = fragmentManager.popBackStackImmediate(backStateName, 0);
if (addToBackStack && !fragmentPopped && fragmentManager.findFragmentByTag(backStateName) == null) {
fragmentManager
.beginTransaction()
// .setCustomAnimations(android.R.anim.slide_in_left, android.R.anim.slide_out_right, android.R.anim.fade_in, android.R.anim.fade_out)
.replace(R.id.container, fragment)
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
.addToBackStack(backStateName) // was 'backStateName'
.commit();
} else {
if (!addToBackStack)
fragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
fragmentManager
.beginTransaction()
// .setCustomAnimations(android.R.anim.slide_in_left, android.R.anim.slide_out_right, android.R.anim.fade_in, android.R.anim.fade_out)
.replace(R.id.container, fragment)
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
.disallowAddToBackStack()
.commit();
}
}
导航抽屉包含:带 profilePhoto
的 ImageView 打开 ProfileMainFragment
和几个打开 MainFragmentCategory
的类别。当从 navigationDrawerMenu
中选择片段时 Boolean addToBackStack
是 false
,当在片段中选择 true
时(从 MainFragmentCategory
移动到 DetialFragmentCategory
)或单击 profilePhoto
在 navigationDrawer
.
fragmentPopped
总是 false
,为什么会这样?即使我在 navigationDrawer
中单击 profilePhoto
并再次单击 profilePhoto
。它应该避免将它添加到 backStack 第二次(和第三次,第四次......),但它没有。
知道我怎样才能让它正确吗?
您可以在替换片段之前添加以下代码。
// Replace fragmentCotainer with your container id
Fragment currentFragment = fragmentManager.findFragmentById(R.id.fragmentCotainer);
// Return if the class are the same
if(currentFragment.getClass().equals(fragment.getClass())) return;
我正在尝试避免使用此方法将相同的片段添加到 backStack:
public static void replaceFragment(FragmentManager fragmentManager, Fragment fragment, Boolean addToBackStack) {
String backStateName = fragment.getClass().getName();
boolean fragmentPopped = fragmentManager.popBackStackImmediate(backStateName, 0);
if (addToBackStack && !fragmentPopped && fragmentManager.findFragmentByTag(backStateName) == null) {
fragmentManager
.beginTransaction()
// .setCustomAnimations(android.R.anim.slide_in_left, android.R.anim.slide_out_right, android.R.anim.fade_in, android.R.anim.fade_out)
.replace(R.id.container, fragment)
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
.addToBackStack(backStateName) // was 'backStateName'
.commit();
} else {
if (!addToBackStack)
fragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
fragmentManager
.beginTransaction()
// .setCustomAnimations(android.R.anim.slide_in_left, android.R.anim.slide_out_right, android.R.anim.fade_in, android.R.anim.fade_out)
.replace(R.id.container, fragment)
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
.disallowAddToBackStack()
.commit();
}
}
导航抽屉包含:带 profilePhoto
的 ImageView 打开 ProfileMainFragment
和几个打开 MainFragmentCategory
的类别。当从 navigationDrawerMenu
中选择片段时 Boolean addToBackStack
是 false
,当在片段中选择 true
时(从 MainFragmentCategory
移动到 DetialFragmentCategory
)或单击 profilePhoto
在 navigationDrawer
.
fragmentPopped
总是 false
,为什么会这样?即使我在 navigationDrawer
中单击 profilePhoto
并再次单击 profilePhoto
。它应该避免将它添加到 backStack 第二次(和第三次,第四次......),但它没有。
知道我怎样才能让它正确吗?
您可以在替换片段之前添加以下代码。
// Replace fragmentCotainer with your container id
Fragment currentFragment = fragmentManager.findFragmentById(R.id.fragmentCotainer);
// Return if the class are the same
if(currentFragment.getClass().equals(fragment.getClass())) return;