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

时间:2019-08-24 05:07:04

标签: android kotlin navigation android-architecture-components android-jetpack

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

Sub FillData() Dim ws As Worksheet Set ws = ActiveWorkbook.Sheets.Add(After:=ActiveSheet) With ws Range("A1").Value2 = "joro1. Inc" Range("A2").Value2 = "joro1" Range("B1").Value2 = "100" Range("B2").Value2 = "1" Range("C1").Value2 = "100" Range("C2").Value2 = "2" Range("D1").Value2 = "10" Range("D2").Value2 = "2" End With End Sub 中,我添加了

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()中的向上按钮?

预先感谢

4 个答案:

答案 0 :(得分:1)

我认为接受的答案有点混乱。所以,我找到了一个干净的代码。它非常适合我的用例,因为按下设备后退按钮时我不需要做任何特殊的事情。因此,这里有相同要求的任何人都可以遵循我的代码。

在 MainActivity 的 onCreate 中:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    val navController = findNavController(R.id.nav_host_fragment)
    appBarConfiguration = AppBarConfiguration(navController.graph)
    // Check if androidx.navigation.ui.NavigationUI.setupActionBarWithNavController is imported
    // By default title in actionbar is used from the fragment label in navigation graph
    // To use the app name, remove label else if you want to add customized label specify it there
    setupActionBarWithNavController(this, navController, appBarConfiguration)

    ...

  }

同样,在 MainActivity 本身中:

override fun onSupportNavigateUp(): Boolean {
    val navController = findNavController(R.id.fragment)
    // Check if androidx.Navigation.ui navigateUp is imported and used
    return navController.navigateUp(appBarConfiguration) || super.onSupportNavigateUp()
}

为了更好的理解,我添加了注释。如果您认为答案有帮助,请点赞。谢谢。快乐发展:)

编辑 1: 无需在片段中使用 supportActionBar.setDisplayHomeAsUpEnabled(true)。 AppBarConfiguration 会处理它。

答案 1 :(得分:0)

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

首先,在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())
        }

答案 2 :(得分:0)

如果你使用 noActionBar 主题并且你想使用你自己的工具栏作为片段的 actionBar,你可以使用这个方法

在主机活动中

override fun onSupportNavigateUp(): Boolean {
    return findNavController(R.id.navHostFragment).navigateUp()
}

在片段的 onCreateView 中

(activity as AppCompatActivity).setSupportActionBar(binding.toolbar)
(activity as AppCompatActivity).supportActionBar?.setDisplayHomeAsUpEnabled(true)

答案 3 :(得分:0)

以非常简单的方式,您只需要在 Activity 上设置 supportNavigateUp。

MainActivity中:

private lateinit var navController: NavController

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment
    navController = navHostFragment.navController

    setupActionBarWithNavController(navController)
}

override fun onSupportNavigateUp(): Boolean {
    return navController.navigateUp() || super.onSupportNavigateUp()
}

在我的情况下它有效