首页 > 解决方案 > 当我导航到新目的地时如何禁用向上按钮

问题描述

我尝试在导航到新目的地时禁用向上按钮,并将此目的地设为新的起始目的地。

// navigation.xml
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/navigation"
    app:startDestination="@id/firstFragment">

    <fragment
        android:id="@+id/firstFragment"
        android:name="com.example.myproject.FirstFragment"
        android:label="FirstFragment" >
        <action
            android:id="@+id/action_firstFragment_to_secondFragment"
            app:destination="@id/secondFragment"
            app:popUpTo="@id/firstFragment"
            app:popUpToInclusive="true" />
    </fragment>
    <fragment
        android:id="@+id/secondFragment"
        android:name="com.example.myoroject.SecondFragment"
        android:label="fragment_second"
        tools:layout="@layout/fragment_second" />
</navigation>

但是当我导航到 secondFragment 时,TopLeft 中的后退按钮总是在这里并且不会消失。

更新

我的主要活动如下所示。

class MainActivity : AppCompatActivity() {

    private lateinit var binding: ActivityMainBinding
    private lateinit var navController: NavController
    private lateinit var drawerLayout: DrawerLayout

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
        drawerLayout = binding.drawerLayout
        navController = this.findNavController(R.id.myNavHostFragment)

        navController.addOnDestinationChangedListener { _, destination, _ ->
            if(destination.id == R.id.firstFragment) {
                drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_CLOSED)
            } else {
                drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED)
            }
        }

        NavigationUI.setupActionBarWithNavController(this, navController, drawerLayout)
        NavigationUI.setupWithNavController(binding.navView, navController)
    }

    override fun onSupportNavigateUp(): Boolean {
        return NavigationUI.navigateUp(navController, drawerLayout)
    }
}

顺便说一句,我想禁用 firstFragment 中的抽屉切换按钮,它似乎也不起作用。

标签: androidandroid-architecture-navigationandroid-jetpack-navigation

解决方案


您可以查看文档

顶级目的地不会在顶部应用栏中显示向上按钮,因为没有更高级别的目的地。
当用户在任何其他目的地时,导航按钮显示为向上按钮。要配置仅使用起始目的地作为顶级目的地的导航按钮,请创建一个AppBarConfiguration对象

如果您想自定义哪些目的地被视为顶级目的地,您可以将一组目的地 ID 传递给构造函数,例如:

val appBarConfiguration = AppBarConfiguration(setOf(R.id.firstFragment, R.id.secondFragment))
setupActionBarWithNavController(navigationController, appBarConfiguration)

关于DrawerLayout.
如果目的地不使用 a DrawerLayout,导航按钮将被隐藏。


推荐阅读