正在调用 OnBackPressedCallback,但应用程序不会返回

Jas*_*oms 6 android android-jetpack android-architecture-navigation androidx

我最近更新了我的依赖项,以包含OnBackPressedCallback从接口到抽象类的更改。

我已经根据此处的新文档进行了设置,但我觉得事情并没有像他们应该的那样工作。

我的片段OnCreate看起来很像文档:

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        requireActivity().onBackPressedDispatcher.addCallback(this) {
            backPressed()
    }
}
Run Code Online (Sandbox Code Playgroud)

当我按下后退按钮时,代码backPressed()运行,但没有更多的发生。

我曾尝试在回调内部调用handleBackPressed()andrequireActivity().onBackPressedDispatcher.onBackPressed()requireActivity().onBackPressed(),但这些都会导致 StackOverflowError ,因为它似乎递归地运行该回调。

必须有一些非常明显的东西我错过了......

ian*_*ake 11

当您注册 时OnBackPressedCallback,您就承担了处理后退按钮的责任。这意味着当您收到回调时,不会发生其他后按行为。

如果您使用Navigation,则可以使用NavController弹出后退堆栈:

requireActivity().onBackPressedDispatcher.addCallback(this) {
    backPressed()
    // Now actually go back
    findNavController().popBackStack()
}
Run Code Online (Sandbox Code Playgroud)


aar*_*ino 9

这对我有用androidx.appcompat:appcompat:1.1.0

requireActivity().onBackPressedDispatcher.addCallback(
        this,
        object : OnBackPressedCallback(true) {
            override fun handleOnBackPressed() {
                Log.d(TAG, "Fragment back pressed invoked")
                // Do custom work here    

                // if you want onBackPressed() to be called as normal afterwards
                if (isEnabled) {
                    isEnabled = false
                    requireActivity().onBackPressed()
                }
            }
        }
    )
Run Code Online (Sandbox Code Playgroud)


Ана*_* К. 8

必须有一些非常明显的东西我错过了......

在要求 Activity 处理回压之前,您忘记禁用片段中的自定义回调。

我的解决方案适合我:

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState); 

        final OnBackPressedCallback callback = new OnBackPressedCallback(true) {
            @Override
            public void handleOnBackPressed() {
               if (/*situation to handle back pressing*/){
                //here handle your backPress in your fragment
                } else {
                   setEnabled(false); //this is important line
                   requireActivity().onBackPressed();
                }
            }
        };
        requireActivity().getOnBackPressedDispatcher().addCallback(this, callback);
    }
Run Code Online (Sandbox Code Playgroud)