在带有导航组件的startDestination中返回按钮

时间:2019-02-06 23:53:34

标签: android kotlin android-architecture-navigation

我需要第二个活动和一个导航图,并且在工具栏中有一个返回按钮,第一个活动也包含一个导航图

在第二个活动中,如果出现后退箭头按钮,但在活动编号中,则输入片段时,我具有onSupportNavigateUp和setupActionBarWithNavController。

尝试在活动和片段中添加setHomeButtonEnabled和setDisplayHomeAsUpEnabled,如果按钮向后显示,但是当我在前面输入一些片段并返回片段时,startDestination会消失按钮向后

我只需要将按钮保留在活动中并解决我的问题

4 个答案:

答案 0 :(得分:1)

您不能,活动有其自己的工具栏,在您的情况下,它们有两个不同的NavControllers。因此,您的第二个活动将为其片段管理NavUp Button,并且当目标片段开始时,NavUpButton(Backbutton)消失了,因为它没有剩余的目的地。而且,如果您以编程方式在第二个活动的开始目标上显示NavUp Button并管理onClick并启动第一个活动,该活动始终转到第一个活动片段的“开始”目标,因为它具有自己的导航控制器。

问题是导航UI不能那样工作。更好的方法是只使用一个活动并包含多个片段。并使用其他任何方法在同一导航控制器中解决您的问题。

答案 1 :(得分:0)

添加 setHomeButtonEnabled 函数。去你的回归行动。如果您要返回带有按钮的按钮,请将其添加到onClick或带有backPress,请覆盖backPress。

此解决方案:当您尝试返回startDestination时,将设置按钮启用。

答案 2 :(得分:0)

您可以通过指定setFallbackOnNavigateUpListener来实现:

private fun setupToolbar() {
    val navController = findNavController(R.id.nav_host_fragment)

    val appBarConfiguration =
        AppBarConfiguration.Builder()
            .setFallbackOnNavigateUpListener { onNavigateUp() }
            .build()

    dataBinding.toolbar.apply {
        setupWithNavController(navController, appBarConfiguration)
    }
}

然后在“活动”中执行任何操作:

override fun onNavigateUp(): Boolean {
    finish()
    return true
}

答案 3 :(得分:0)

我创建了一个界面来显示/隐藏导航主机活动中的按钮。以下是活动如何实现显示/隐藏按钮的接口方法的方法:

    override fun showUpButton() {
    val navController = this.findNavController(R.id.nav_host)
    val listener = AppBarConfiguration.OnNavigateUpListener { navController.navigateUp() }
    val abc = AppBarConfiguration.Builder().setFallbackOnNavigateUpListener(listener).build()
    NavigationUI.setupActionBarWithNavController(this, navController, abc)
}


override fun hideUpButton() {
    val navController = this.findNavController(R.id.nav_host)
    NavigationUI.setupActionBarWithNavController(this, navController)
}

按下向上按钮时,在活动中显示方法:

    override fun onSupportNavigateUp(): Boolean {
    val navController = this.findNavController(R.id.nav_host)
    if(!navController.navigateUp()){ // When in start destination
        onBackPressed()
    }
    return navController.navigateUp()
}

在片段中,只要按下后退按钮(NOT UP按钮)就可以收听:

    private fun setupBackPress() {
    requireActivity()
        .onBackPressedDispatcher
        .addCallback(this, object : OnBackPressedCallback(true) {
            override fun handleOnBackPressed() { 
            }
        })
}