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()
    }
}
相关推荐
写不来代码的草莓熊39 分钟前
vue前端面试题——记录一次面试当中遇到的题(9)
前端·javascript·vue.js
JinSo1 小时前
pnpm monorepo 联调:告别 --global 参数
前端·github·代码规范
程序员码歌1 小时前
豆包Seedream4.0深度体验:p图美化与文生图创作
android·前端·后端
urhero1 小时前
工作事项管理小工具——HTML版
前端·html·实用工具·工作事项跟踪·任务跟踪小工具·本地小程序
二十雨辰1 小时前
eduAi-智能体创意平台
前端·vue.js
golang学习记1 小时前
从0死磕全栈之Next.js connection() 函数详解:强制动态渲染的正确姿势(附实战案例)
前端
郝学胜-神的一滴1 小时前
Three.js光照技术详解:为3D场景注入灵魂
开发语言·前端·javascript·3d·web3·webgl
m0dw2 小时前
vue懒加载
前端·javascript·vue.js·typescript
国家不保护废物2 小时前
手写 Vue Router,揭秘路由背后的魔法!🔮
前端·vue.js
菜鸟‍2 小时前
【前端学习】仿Deepseek官网AI聊天网站React
前端·学习·react.js