handleOnBackPressed 不适用于一个片段

handleOnBackPressed not working on one fragment

我在我的程序中使用带有抽屉和应用栏的导航组件。

从主页片段,它有一个回收视图,当每个项目被点击时,nav_host_fragment 使用以下行托管另一个具有所选 itme 的片段:

Navigation.findNavController(view).navigate(R.id.doTimedTaskFragment, args);

问题是,如果用户点击应用栏中的后退按钮,我需要询问他们是否要放弃他们在新片段 (doTimedTaskFragment) 中取得的进展。

我挖掘了 Google 文档,下面 link 给出了我应该如何做。 https://developer.android.com/guide/navigation/navigation-custom-back#java

public class MyFragment extends Fragment {

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

        // This callback will only be called when MyFragment is at least Started.
        OnBackPressedCallback callback = new OnBackPressedCallback(true /* enabled by default */) {
            @Override
            public void handleOnBackPressed() {
                // Handle the back button event
            }
        };
        requireActivity().getOnBackPressedDispatcher().addCallback(this, callback);

        // The callback can be enabled or disabled here or in handleOnBackPressed()
    }
    ...
}

但是,handleOnBackPressed() 从未被调用,我怀疑我上面使用的代码行指向新片段,但我找不到解决此问题的方法。

EDIT/UPDATE: 我的问题最初是询问如何处理点击导航组件的左(后)箭头点击行为,在我的例子中,我在片段内覆盖 onOptionsItemSelected 并且代码比在 [=14 内覆盖更清晰和更好=].

这里是screenshot of my mobile navigation.xml

OnBackPressedCallback 在设备上调用后退按钮而不是 Toolbar 后退按钮。对于工具栏后退按钮,您必须使用导航控制器进行设置。

在你的activity的onCreate中:

setSupportActionBar(findViewById(R.id.toolbar))
val nc = findNavController(this, R.id.nav_host_fragment)
val appBarConfiguration = AppBarConfiguration.Builder(nc.graph).build()
setupActionBarWithNavController(
    this,
    nc,
    appBarConfiguration
)

然后:

override fun onSupportNavigateUp(): Boolean {
    //Handle the toolbar back button here.
    val navController = findNavController(this, R.id.nav_host_fragment)
    navController.currentDestination?.let {
        if (it.id == R.id.someFragment) {
            //do something here
        } else {
            navController.popBackStack()
        }
    }
    return super.onSupportNavigateUp()
}