首页 > 解决方案 > 如何使用导航组件处理片段内的向上按钮

问题描述

我正在制作一个简单的笔记应用程序,我有 2 个带有导航组件的片段,一个片段有一个笔记列表,另一个用于编辑或创建新笔记。

MainActivity我添加

val navController = this.findNavController(R.id.host_fragment)
NavigationUI.setupActionBarWithNavController(this, navController)

然后覆盖onSupportNavigateUp()

override fun onSupportNavigateUp(): Boolean {
        val navController = this.findNavController(R.id.host_fragment)
        return navController.navigateUp()
    }

NoteEditFragment

requireActivity().onBackPressedDispatcher.addCallback(this) {
        saveOrUpdateNote(noteId, note)
    }

现在按下设备中的“后退按钮”时一切正常,但是onBackPressedDispatcher.addCallback()当我按下屏幕左上角的“向上按钮”时会触发音符。

我的问题是:我如何处理我的这个向上按钮NoteEditFragment

提前致谢

标签: androidkotlinnavigationandroid-architecture-componentsandroid-jetpack

解决方案


最后,我找到了解决方案。

首先在activity onCreate方法中,我必须像我一样连接导航:

val navController = this.findNavController(R.id.host_fragment)
NavigationUI.setupActionBarWithNavController(this, navController)

然后仍然在MainActivity覆盖onSupportNavigateUp()

override fun onSupportNavigateUp(): Boolean
{
    val navController = this.findNavController(R.id.host_fragment)
    return navController.navigateUp()
}

然后在Fragment onCreateView我必须启用选项菜单中:

setHasOptionsMenu(true)

然后在fragment我覆盖onOptionsItemSelected

override fun onOptionsItemSelected(item: MenuItem): Boolean
{
    // handle the up button here
    return NavigationUI.onNavDestinationSelected(item!!,
        view!!.findNavController())
            || super.onOptionsItemSelected(item)
}

注意:我认为如果您有多个选项菜单,那么我认为您必须做一个when (item)声明来检查选择了哪个选项。

此外,如果您想处理设备后退按钮,那么您可以在您的fragment onCreateViewMethod

requireActivity().onBackPressedDispatcher.addCallback(this)
    {
        // handle back button

// change this line to whatever way you chose to navigate back          
findNavController().navigate(NoteEditFragmentDirections.actionNoteEditFragmentToNoteListFragment())
        }

推荐阅读