首页 > 解决方案 > 避免多次将相同的片段添加到 backStack

问题描述

我有一个包含 4 个片段的活动。我想避免用户在退出前点击 100 次的情况。当一个片段被设置时,它被添加到后台堆栈。例如:用户按以下顺序设置片段:1、2、3、4 然后他设置片段 2 和 4。我的 backStack 看起来像这样(片段 4 可见):2、4、3、2、1 并退出。我希望我的 backStack 看起来像:2、3、1 并退出。

我试图用 popBackStackImmediate(string, int flags) 解决我的问题,就像在这篇文章中一样: 防止同一片段堆叠不止一次(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();
        }
    }

我希望每个片段在后台堆栈中不超过一次,而不会破坏后台堆栈的顺序,以便拥有一个看起来像这样的后台堆栈:2、3、1 并退出。:)

标签: androidandroid-fragmentsback-stackfragmenttransactionfragment-backstack

解决方案


请找到以下代码,因为它可以帮助您,我也可以在评论部分添加它,但我的声誉不足以添加评论

 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
  }

推荐阅读