Android Kotlin:不使用Navigation Component,关闭Activity后跳过BottomSheet返回原Fragment
解决方法:关闭Activity C后直接回到Fragment A
方法一:启动Activity C时立即关闭BottomSheet B
这是最直接的方案,用户进入编辑页面后,操作弹窗已无存在必要。在BottomSheetDialogFragment(B)的Edit按钮点击事件中,先关闭当前弹窗,再启动Activity C:
// BottomSheetDialogFragment B中的点击逻辑 editOption.setOnClickListener { // 先关闭当前BottomSheet弹窗 dismiss() // 启动Activity C并传递必要参数 val intent = Intent(requireContext(), ActivityC::class.java) intent.putExtra("ACCOUNT_INFO", accountData) startActivity(intent) }
关闭Activity C后,宿主Activity回到前台,此时B已被关闭,自然显示Fragment A。
方法二:通过结果回调在C关闭后关闭B
若需保留B的状态(比如编辑完成后要回到弹窗继续操作),可使用Activity结果监听,在C关闭后触发B的关闭:
- 在BottomSheetDialogFragment(B)中注册结果监听:
private val editLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> // 无论编辑成功与否,关闭BottomSheet dismiss() } // Edit按钮点击事件 editOption.setOnClickListener { val intent = Intent(requireContext(), ActivityC::class.java) intent.putExtra("ACCOUNT_INFO", accountData) editLauncher.launch(intent) }
- 在Activity C中完成操作后关闭自身:
// Activity C中保存编辑后的逻辑 saveBtn.setOnClickListener { // 执行保存操作 finish() }
方法三:广播通知宿主关闭B
通过广播让宿主Activity在C关闭后关闭B:
- 在宿主Activity中注册广播接收器:
private val closeSheetReceiver = object : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { val bottomSheet = supportFragmentManager.findFragmentByTag("BottomSheetB") as? BottomSheetDialogFragment bottomSheet?.dismiss() } } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) registerReceiver(closeSheetReceiver, IntentFilter("ACTION_CLOSE_SHEET")) } override fun onDestroy() { super.onDestroy() unregisterReceiver(closeSheetReceiver) }
- 在Activity C关闭时发送广播:
finish() sendBroadcast(Intent("ACTION_CLOSE_SHEET"))
总结
优先推荐方法一,逻辑简单且符合操作直觉;仅在特殊需求场景下,再考虑方法二或方法三。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

