我的活动有4个片段。我想避免用户在退出前单击100次的情况。设置片段后,会将其添加到堆栈中。 例如:用户按以下顺序设置片段:1、2、3、4,然后分别设置碎片2和4。我的backStack看起来像这样(片段4可见):2、4、3、2、1并退出。 我希望我的backStack看起来像:2、3、1,然后退出。
我试图用popBackStackImmediate(string,int flags)解决我的问题,就像这篇文章: Prevent The Same Fragment From Stacking More Than Once ( addToBackStack) 但是我的backStack看起来像(有4个可见的)2、1,然后退出。 我推断出popBackStackImmediate()正在移除弹出的堆栈上的堆栈(希望您知道我的意思)。
private void setFragment(Fragment fragment) {
String backStateName = fragment.getClass().getName();
FragmentManager manager = getSupportFragmentManager();
boolean fragmentPopped = manager.popBackStackImmediate (backStateName, 0);
if (!fragmentPopped){ //fragment not in back stack, create it.
FragmentTransaction ft = manager.beginTransaction();
ft.replace(R.id.main_frame, fragment);
ft.addToBackStack(backStateName);
mMainNav.setItemBackgroundResource(R.color.PopWindowBorder_HomeRenovationfragment);
ft.commit();
}
}
我希望每个片段在后台堆栈中的出现时间不超过一次,而不会破坏backStack的顺序,从而使后台堆栈看起来像:2、3、1并退出。 :)
答案 0 :(得分:0)
请找到以下代码,因为它可以为您提供帮助,我也可以在评论部分中添加它,但是我的声誉不足以添加评论
private fun loadFragment(fragment: Fragment, previousFragment: Fragment?) {
val transaction = supportFragmentManager.beginTransaction()
if (supportFragmentManager.findFragmentByTag(fragment::class.java.simpleName) != null) {
if (previousFragment != null) {
transaction.hide(previousFragment).show(fragment).commit()
} else {
transaction.show(fragment).commit()
}
} else {
if (previousFragment != null) {
transaction.hide(previousFragment).add(R.id.frame_container, fragment, fragment::class.java.simpleName).addToBackStack(null).commit()
} else {
transaction.add(R.id.frame_container, fragment, fragment::class.java.simpleName).addToBackStack(null).commit()
}
}
this@BaseActivity.previousFragment = fragment
}