FragmentManager 之 addToBackStack 作用

FragmentManager 管理 Fragment 返回堆栈。在运行时,FragmentManager 可以执行添加或移除 Fragment 等返回堆栈操作来响应用户互动。每一组更改作为一个单元(称为 FragmentTransaction)一起提交。

当用户点按设备上的返回按钮时,或者你调用 FragmentManager.popBackStack() 时,最上面的 Fragment 事务会从堆栈中弹出。如果堆栈上没有更多 Fragment 事务,并且你没有使用子 Fragment,则返回事件会向上传递到 Activity。

弹出返回堆栈时,所有这些操作会作为一项原子化操作反转。不过,如果你在调用 popBackStack() 之前提交了其他事物,并且你没有对事务使用 addToBackStack(), 则这些操作不会反转。

案例1

如果没有对事务使用 addToBackStack(), 在 MainActivity 中点击设备的返回按钮,整个应用退出。

kotlin 复制代码
class MainActivity : AppCompatActivity() {
    companion object {
        private const val TAG = "MainActivity"
    }

    private lateinit var mBinding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        mBinding = DataBindingUtil.setContentView(this, R.layout.activity_main)

        loadFragment(MainFragment(), "mainFragment", false)
    }

    private fun loadFragment(fragment: Fragment, tag: String, addToBackStack: Boolean) {
        val transaction = supportFragmentManager.beginTransaction()
            .replace(R.id.fragment_container, fragment, tag)
        if (addToBackStack) {
            transaction.addToBackStack(tag)
        }
        transaction.commit()
    }
}

案例2

如果对事务使用 addToBackStack(), 在 MainActivity 中点击设备的返回按钮,MainFragment 会退出,MainActivity 会在返回堆栈栈顶。

kotlin 复制代码
class MainActivity : AppCompatActivity() {
    companion object {
        private const val TAG = "MainActivity"
    }

    private lateinit var mBinding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        mBinding = DataBindingUtil.setContentView(this, R.layout.activity_main)

        loadFragment(MainFragment(), "mainFragment", true)
    }

    private fun loadFragment(fragment: Fragment, tag: String, addToBackStack: Boolean) {
        val transaction = supportFragmentManager.beginTransaction()
            .replace(R.id.fragment_container, fragment, tag)
        if (addToBackStack) {
            transaction.addToBackStack(tag)
        }
        transaction.commit()
    }
}

案例3

在 btnMain, btnFirst 和 btnMain 三个点击事件中的 FragmentTransaction 都使用 addToBackStack, 点击生成的 FragmentTransaction 都会存入返回堆栈中,点击设备的返回键,则会按顺序逐一复原

kotlin 复制代码
class MainActivity : AppCompatActivity() {
    companion object {
        private const val TAG = "MainActivity"
    }

    private lateinit var mBinding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        mBinding = DataBindingUtil.setContentView(this, R.layout.activity_main)

        loadFragment(MainFragment(), "mainFragment", false)

        mBinding.btnMain.setOnClickListener(object: View.OnClickListener {
            override fun onClick(p0: View?) {
                Log.i(TAG, "BtnMain click")
                loadFragment(MainFragment(), "mainFragment", true)
            }
        })

        mBinding.btnFirst.setOnClickListener(object: View.OnClickListener {
            override fun onClick(p0: View?) {
                Log.i(TAG, "BtnFirst click")
                loadFragment(FirstFragment(), "firstFragment", true)
            }
        })

        mBinding.btnSecond.setOnClickListener(object: View.OnClickListener {
            override fun onClick(p0: View?) {
                Log.i(TAG, "BtnSecond click")
                loadFragment(SecondFragment(), "secondFragment", true)
            }
        })
    }

    private fun loadFragment(fragment: Fragment, tag: String, addToBackStack: Boolean) {
        val transaction = supportFragmentManager.beginTransaction()
            .replace(R.id.fragment_container, fragment, tag)
        if (addToBackStack) {
            transaction.addToBackStack(tag)
        }
        transaction.commit()
    }
}
相关推荐
江米小枣tonylua18 分钟前
TypeScript 全面の拥抱 !Prisma 8 + Electron 升级实战
前端
闪耀之光M7833 分钟前
npm命令解析
前端
咸鱼老弟40 分钟前
AI Agent 的"自主性悖论"——为什么给它的自由度越大,越要配一套更硬的护栏
前端·人工智能
默_笙1 小时前
💫 闭包是个背包:拆解小米前端面试题里的三道"闭包陷阱"
前端·javascript·面试
天若有情6732 小时前
粒子星空背景单页HTML模板|炫酷动态星空特效网页(纯前端)
前端·html·css动画·网页特效·粒子星空·静态网页模版
工业涂料百问2 小时前
【趋势前沿】系列(三)工业涂料国产替代的三个台阶:航空、海工、电子的突破路径与认证壁垒
前端
前端snow2 小时前
ai agent --- agentic RAG
前端
gyratesky2 小时前
记录一种很新的大屏开发方式
前端·数据可视化
DeepAgent3 小时前
AI Agent 入门指南(05):Agent 循环——观察、思考、行动
面试·agent