代码之家  ›  专栏  ›  技术社区  ›  David Corsalini

DialogFragment忽略OnBackPressedDispatcher

  •  0
  • David Corsalini  · 技术社区  · 6 年前

    我正试着用一个 BottomSheetDialogFragment ,这是一个 DialogFragment ,使用 'androidx.activity:activity-ktx:1.1.0-alpha01' 'androidx.fragment:fragment-ktx:1.2.0-alpha01' .

    handleOnBackPressed() 对话片段 OnBackPressedCallback 按下后退按钮时启用。

    我认为 正在截取后退按钮,因为 ComponentActivity mOnBackPressedDispatcher.onBackPressed();

    有没有办法覆盖 按后退按钮的处理?

    0 回复  |  直到 6 年前
        1
  •  6
  •   Mücahid Kambur    6 年前

    谷歌开发人员真的很难理解。总之,我找到了一个不使用接口的解决方案。

    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
        return object : Dialog(requireContext(), theme) {
            override fun onBackPressed() {
                // handle back press
            }
        }
    }
    

    只需覆盖onCreateDialog,并覆盖其中的onBackPressed。

        2
  •  1
  •   David Corsalini    6 年前

    我找到了一个解决方案,但我希望库能处理好这个用例。

    BottomSheetDialog :

    class BackPressBottomSheetDialog(context: Context, @StyleRes theme: Int, 
    private val callback: BackPressBottomSheetDialogCallback) :
            BottomSheetDialog(context, theme) {
    
        override fun onBackPressed() {
            if (callback.shouldInterceptBackPress()) callback.onBackPressIntercepted()
            else super.onBackPressed()
        }
    }
    

    而它 interface

    interface BackPressBottomSheetDialogCallback {
        fun shouldInterceptBackPress(): Boolean
        fun onBackPressIntercepted()
    }
    

    BottomSheetDialogFragment

    private val dialogCallback = object : BackPressBottomSheetDialogCallback {
          override fun shouldInterceptBackPress(): Boolean {
            //TODO should you intercept the back button?
          }
    
          override fun onBackPressIntercepted() {
            //TODO what happens when you intercept the back button press
          }
    }
    
    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
        return BackPressBottomSheetDialog(requireContext(), theme, dialogCallback)
    }