Android:覆盖片段中定义的应用栏中的向上导航

Android: Override Navigate Up in App Bar Defined in Fragment

我有一个应用栏 从我的片段 定义,而不是 activity 通过使用

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)

        binding.toolbar.apply {
            //add menu
            inflateMenu(R.menu.menu_fragment)

            //setup with navcontroller/navgraph
            setupWithNavController(findNavController())
        }
}

我面临的问题是尝试在用户使用应用栏单击“向上导航”按钮时显示警告消息。我只希望在一个片段中出现这种行为。

我在网上找到了与 activity 中定义的应用栏相关的解决方案,但它们似乎对我不起作用(例如使用覆盖乐趣 onSupportNavigateUp()。 如果我能做到这一点,有什么想法吗?

更新

最初,我实施了所选的答案,该答案有效但导致了一些内存泄漏。回答这个问题的好心人还找到了内存泄漏的解决方法 。不幸的是,它对我来说效果不是很好(我相信因为我正在使用导航组件)但它可能对你有用。

后来我意识到我可以通过将这行代码添加到我的工具栏代码中来轻松覆盖向上导航的默认行为:

        binding.toolbar.apply {
            //add menu
            inflateMenu(R.menu.menu_fragment)

            //setup with navcontroller/navgraph
            setupWithNavController(findNavController())
            
            //****************ADD THIS******************
            setNavigationOnClickListener { view ->
                //do what you want after user clicks navigate up button
            }
        }

完全不明白你的问题!

尽管为您的“向上导航”按钮尝试此操作 单击requireActivity().onBackPressed()

The problem I'm facing is trying to implement a warning message when a user clicks the Navigate Up button using the app bar. I want this behaviour only in one fragment.

因此,您只需要捕获点击该特定片段的应用栏的向上按钮的事件。

您可以为该片段启用选项菜单:

setHasOptionsMenu(true)

并覆盖 onOptionsItemSelected 以捕获向上按钮 ID:

override fun onOptionsItemSelected(item: MenuItem): Boolean {
    if (item.itemId == android.R.id.home) {
        // Handle the UP button here
        Toast.makeText(requireContext(), "UP button clicked", Toast.LENGTH_SHORT).show()
        return true
    }
    return super.onOptionsItemSelected(item)
}

注意:如果您想为该片段使用除默认工具栏以外的唯一工具栏,

now I am unable to inflate my menu using inflateMenu(R.menu.menu_fragment). Any ideas?

您可以删除此 inflation,并为此覆盖 onCreateOptionsMenu

override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
    inflater.inflate(R.menu.menu_fragment, menu)
}