如何将 onBackPressedCallback 添加到片段?

Dav*_*ave 2 android

我已经在几个地方看到了这一点,但由于没有在线示例,因此无法弄清楚如何实现它,我想知道我是否误解了它的含义。

addOnBackPressedCallback 的 android 开发者链接

我想知道这是否意味着我可以在我的片段中添加一个回调来onBackPressed()在它到达活动之前接收它。

在我的片段中,我实现了

implements OnBackPressedCallBack
Run Code Online (Sandbox Code Playgroud)

然后实现了方法

@Override
public boolean handleOnBackPressed() {
    Log.d(TAG, "handleOnBackPressed: hello");
    return true;
}
Run Code Online (Sandbox Code Playgroud)

但它没有拿起它并直接进入主要活动onBackPressed()

我进一步阅读并看到我的片段需要从 FragmentActivity 扩展

public class MainExampleFragment extends FragmentActivity implements View.OnClickListener, OnBackPressedCallback {
Run Code Online (Sandbox Code Playgroud)

而不是

appCompatActivity.getSuppportFragmentManager
Run Code Online (Sandbox Code Playgroud)

打电话

FragmentActivity.getSupportFragmentManager 
Run Code Online (Sandbox Code Playgroud)

相反,但是当尝试设置包时,这会在 Fragment.newInstance 方法中抛出并出错。

有没有人做这方面的信息,谢谢

aar*_*ino 10

正如@Derek Zhu 指出的那样,似乎如果您在活动中覆盖 onBackPressed,那么 Fragment 的 onBackPressedCallback 将不起作用。我发现如果我也想在活动中使用它,那么我也需要在onBackPressedDispatcher.addCallback那里使用。

活动:

onBackPressedDispatcher.addCallback(
        this,
        object : OnBackPressedCallback(true) {
            override fun handleOnBackPressed() {
                Log.d(TAG, "Activity 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)

分段:

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)

上面的结果是会调用Fragment backpressed,然后Activity backpressed。


Der*_*Zhu 0

AppCompatActivity 扩展 FragmentActivity 扩展 ComponentActivity(androidx.fragment.app.ComponentActivity) 扩展 (androidx.core.app.ComponentActivity)

所以 addOnBackPressedCallback 也应该适用于 AppCompatActivity

  • 我遇到了完全相同的问题,事实证明这是因为我在活动中重写了 onBackPressed() 并且在某些情况下没有调用 super 方法,因此片段没有收到调度的事件调用 (4认同)