【问题标题】:How to fix OnBackPressedCallback if it doesn't work in Fragment?如果 OnBackPressedCallback 在 Fragment 中不起作用,如何修复它?
【发布时间】:2023-01-18 23:01:47
【问题描述】:

在这里我覆盖了 handleOnBackPressed() 方法:

 Log.d("Fragment", "onViewCreated")
        requireActivity().onBackPressedDispatcher.addCallback(viewLifecycleOwner) {
            object : OnBackPressedCallback(true) {
                override fun handleOnBackPressed() {
                    Log.d("Fragment", "Back pressed")
                    if (binding.crimeTitle.text.isBlank()) {
                        Toast.makeText(context, "Title can't be empty!", Toast.LENGTH_SHORT).show()
                        Log.d("Fragment", "Toast showed")
                    } else {
                        Log.d("Fragment", "BackStack popped")
                        findNavController().popBackStack()
                    }
                }
            }
        }

但之后我在日志中只看到“onViewCreated”,按下“后退”按钮后没有任何反应。
我预计至少会看到“后退”。
日志:
(https://i.stack.imgur.com/bAmxq.png)

【问题讨论】:

  • 您可能已经在活动中实施了 OnBackPressed。

标签: android fragment back-button onbackpressed fragment-backstack


【解决方案1】:

onBackPressed() 回调用于处理 Fragment 中的后退按钮按下事件。如果它没有按预期工作,请检查以下几点:

确保将 Fragment 添加到返回堆栈:当将 Fragment 添加到返回堆栈时,按下返回按钮时将调用其 onBackPressed() 回调。如果 Fragment 未添加到返回堆栈,则不会调用其 onBackPressed() 回调。

getFragmentManager().beginTransaction().addToBackStack(null).replace(R.id.container, newFragment).commit();

检查父Activity是否重写了onBackPressed()方法:如果父Activity重写了onBackPressed()方法并且没有调用super.onBackPressed(),则不会调用Fragment中的onBackPressed()回调。确保在 Activity 的 onBackPressed() 方法中调用 super.onBackPressed() 以确保 Fragment 的回调也被调用。

验证 Fragment 是否在前台:如果 Fragment 不在前台,则不会调用其 onBackPressed() 回调。确保 Fragment 对用户可见,并且未被其他 Fragment 或 View 覆盖。

检查您的导入:确保 OnBackPressedCallback 是从正确的包中导入的。在 Android X 上,它应该从 androidx.activity.OnBackPressedCallback 导入,在 Android X 之前,它应该从 android.support.v4.app.OnBackPressedCallback 导入。

检查 OnBackPressedCallback 是否已注册:确保使用 requireActivity().getOnBackPressedDispatcher().addCallback() 方法在 Fragment 的 onActivityCreated() 方法中正确注册了 OnBackPressedCallback。

检查 onBackPressed() 中代码的逻辑流程:确保 onBackPressed() 中的代码按预期执行并且逻辑正确并且在调用 super 方法之前满足所有条件。

通过检查这些要点,您应该能够识别并修复 onBackPressed() 回调在片段中不起作用的问题。

【讨论】:

    猜你喜欢
    • 2022-12-16
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 2013-10-31
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多