Kotlin中如何从多层页面栈直接返回主菜单Activity
问题
我有一个主菜单Activity,用户可从中进入多个不同功能模块。点击对应按钮会跳转至目标Activity,随后该Activity会打开多个Fragment。我希望用户在任意时点点击Done按钮都能直接返回主菜单,但目前点击后仅能返回当前Activity的首个Fragment,是不是我对Activity>Activity>Fragments的栈处理逻辑有误?
主菜单Activity代码
binding.putaway.setOnClickListener { val intent = Intent(this, PutAwayMainActivity::class.java) startActivity(intent) } binding.cyclecount.setOnClickListener { val intent = Intent(this, CycleCountMainActivity::class.java) startActivity(intent) } binding.transfer.setOnClickListener { val intent = Intent(this, TransferMainActivity::class.java) startActivity(intent) } binding.itemlookup.setOnClickListener { val intent = Intent(this, ItemLookupMainActivity::class.java) startActivity(intent) } binding.newreceipt.setOnClickListener { val intent = Intent(this, NewReceiptMainActivity::class.java) startActivity(intent) } binding.additem.setOnClickListener { val intent = Intent(this, NewReceiptAddItemMainActivity::class.java) startActivity(intent) }
NewReceiptMainActivity代码
class NewReceiptMainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_new_receipt_main) val fragment = NewReceiptSelectProgram() val fram = supportFragmentManager.beginTransaction() fram.replace(R.id.nav_newreceipt_fragment,fragment) fram.commit() } }
当前尝试的返回逻辑(仅返回首个Fragment)
private fun donePressed() { parentFragmentManager.popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE) }
解决方案
问题核心是你只操作了Fragment栈,没有处理Activity栈。popBackStackImmediate只会清空当前Activity内的Fragment栈,但当前Activity仍处于系统的Activity栈中,所以退到首个Fragment后就无法继续返回。
要直接回到主菜单,只需销毁当前的功能模块Activity:
最简实现
private fun donePressed() { requireActivity().finish() }
可选:先清Fragment栈再销毁Activity
如果需要确保Fragment资源也被清理,可以先清空Fragment栈再结束Activity(通常finish()已足够):
private fun donePressed() { parentFragmentManager.popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE) requireActivity().finish() }
内容的提问来源于stack exchange,提问作者btorkelson
相关产品推荐
相关产品推荐

