避免将相同的片段多次添加到backStack

时间:2019-07-22 09:22:35

标签: android android-fragments back-stack fragmenttransaction fragment-backstack

我的活动有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并退出。 :)

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
  }