如何使用导航组件处理片段内的向上按钮

Yas*_*imi 5 navigation android kotlin android-architecture-components android-jetpack

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

MainActivity我添加

val navController = this.findNavController(R.id.host_fragment)
NavigationUI.setupActionBarWithNavController(this, navController)
Run Code Online (Sandbox Code Playgroud)

然后覆盖 onSupportNavigateUp()

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

NoteEditFragment

requireActivity().onBackPressedDispatcher.addCallback(this) {
        saveOrUpdateNote(noteId, note)
    }
Run Code Online (Sandbox Code Playgroud)

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

我的问题是:如何从我的NoteEditFragment?

提前致谢

Yas*_*imi 8

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

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

val navController = this.findNavController(R.id.host_fragment)
NavigationUI.setupActionBarWithNavController(this, navController)
Run Code Online (Sandbox Code Playgroud)

然后仍然在MainActivity覆盖onSupportNavigateUp()

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

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

setHasOptionsMenu(true)
Run Code Online (Sandbox Code Playgroud)

然后在fragment我覆盖onOptionsItemSelected

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

注意:我认为如果您有多个选项菜单,那么我认为您必须做一个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())
        }
Run Code Online (Sandbox Code Playgroud)

  • 对于那些正在寻找操作栏上后退按钮的 item.itemid 的人来说,它是:android.R.id.home。请参阅:https://developer.android.com/reference/android/R.id#home (2认同)