ysf*_*yln 7 android android-fragments onbackpressed bottom-sheet
我有一个Bottom Sheet Dialog Fragment包含四个Fragment与ViewPager. 我想在onBackPressed单击时调用一个方法Bottom Sheet Dialog Fragment。OnBackPressedCallback在 my 中实施OnCreateView但未触发。有人知道为什么不叫它吗?
val callback = object : OnBackPressedCallback(true */ true means that the callback is enabled /*) {
override fun handleOnBackPressed() {
// Show your dialog and handle navigation
LogUtils.d("Bottom Sheet -> Fragment BackPressed Invoked")
}
}
// note that you could enable/disable the callback here as well by setting callback.isEnabled = true/false
requireActivity().onBackPressedDispatcher.addCallback(viewLifecycleOwner, callback)
Run Code Online (Sandbox Code Playgroud)
ITJ*_*ott 17
我在寻找 DialogFragment 中存在的相同问题的解决方案时发现了此线程。答案在上面的评论中,但为了完整起见,这里汇总了信息:
解决方案
在 DialogFragment 中重写 onCreateDialog 并设置 OnKeyListener:
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
return super.onCreateDialog(savedInstanceState).apply {
setOnKeyListener { _: DialogInterface, keyCode: Int, keyEvent: KeyEvent ->
if (keyCode == KeyEvent.KEYCODE_BACK && keyEvent.action == KeyEvent.ACTION_UP) {
// <-- Your onBackPressed logic here -->
return@setOnKeyListener true
}
return@setOnKeyListener false
}
}
}
Run Code Online (Sandbox Code Playgroud)
解释
requireActivity().onBackPressedDispatcher.addCallback来自针对不适用于 DialogFragments提出的问题( https://issuetracker.google.com/issues/149173280):
对话框是始终位于活动窗口上方的单独窗口。这意味着无论底层 FragmentManager 处于什么状态,或者您在 Activity 的 onBackPressed() 中运行什么代码(OnBackPressedDispatcher 插入的位置),对话框都将继续拦截系统后退按钮。
从本质上讲,当使用任何使用对话框的组件时,这onBackPressedDispatcher是错误的工具,因为它们在应用程序内的行为方式以及存在于活动之外(之上)的方式。