当前位置: 首页 > 知识库问答 >
问题:

Jetpack导航:操作栏中的标题和后退/向上箭头?

百里光熙
2023-03-14

我已经安装了AndroidStudio的最新金丝雀版本,并遵循了这一点(https://developer.android.com/topic/libraries/architecture/navigation/navigation-implementing)实现简单两页导航的说明。基本上,page1有一个按钮,当点击它时,应用程序显示page2。

这是可行的,但有一个问题。。。它似乎不会自动对操作栏执行任何操作。它是否应该由导航库自动在操作栏上显示向上/向后箭头和“标签”属性?还是我应该像以前一样手动完成所有工作?当显示第2页时,我想在操作(工具)栏上显示后退箭头和“详细信息”。

点击第1页的按钮。

override fun onViewCreated(view: View, savedInstanceState: Bundle?)
{
    button1.setOnClickListener {
        val nav = NavHostFragment.findNavController(this);
        nav.navigate(R.id.show_page2)
    }
}

主要活动XML。默认情况下,它是默认的操作栏,我用工具栏替换了它。没有区别。

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    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:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <androidx.appcompat.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_height="?attr/actionBarSize"
        android:elevation="4dp"
        android:background="?attr/colorPrimary"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        android:theme="@style/ThemeOverlay.AppCompat.ActionBar"
        app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
        android:layout_width="match_parent">
    </androidx.appcompat.widget.Toolbar>

    <fragment
        android:id="@+id/my_nav_host_fragment"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:defaultNavHost="true"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/toolbar"
        app:navGraph="@navigation/nav_graph"/>

</androidx.constraintlayout.widget.ConstraintLayout>

导航图XML。

<?xml version="1.0" encoding="utf-8"?>
<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/nav_graph"
            app:startDestination="@id/page1">

    <activity
        android:id="@+id/mainActivity2"
        android:name="com.android.navtest.MainActivity"
        android:label="activity_main"
        tools:layout="@layout/activity_main"/>
    <fragment
        android:id="@+id/page1"
        android:name="com.android.navtest.BlankFragment2"
        android:label="Home page"
        tools:layout="@layout/page1">
        <action
            android:id="@+id/show_page2"
            app:destination="@id/page2"
            app:enterAnim="@anim/anim1"
            app:popExitAnim="@anim/anim2"/>
    </fragment>
    <fragment
        android:id="@+id/page2"
        android:name="com.android.navtest.BlankFragment"
        android:label="Details"
        tools:layout="@layout/page2"/>
</navigation>

共有3个答案

仲鸿风
2023-03-14

这就是我所做的
当用户向上导航并再次设置时,将调用onSupportNavigateUp通过调用此按钮,告诉Android更新工具栏标题navigateUp通过将其行为委托给给定的导航控制器来处理向上按钮。这通常应该从AppCompatActivity调用。onSupportNavigateUp()。

private lateinit var appBarConfiguration: AppBarConfiguration

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val binding: ActivityGameConfigBinding =
            DataBindingUtil.setContentView(this, R.layout.activity_game_config)
        supportActionBar?.show()

        val navController = Navigation.findNavController(this, R.id.myNavHostFragment)
        NavigationUI.setupActionBarWithNavController(this, navController, null)
        appBarConfiguration = AppBarConfiguration.Builder(navController.graph)
            .build()

        NavigationUI.setupWithNavController(binding.navView, navController)
    }
    override fun onSupportNavigateUp(): Boolean {
        val navController = Navigation.findNavController(this, R.id.myNavHostFragment)
        return NavigationUI.navigateUp(navController, appBarConfiguration)
    }

严恩
2023-03-14

如果您想在多个地方隐藏导航后退按钮(默认仅适用于主片段),可以将片段ID添加到AppBarConfiguration,并将其作为setupActionBarWithNavController的第二个参数传递,例如:

val appBarConfiguration = AppBarConfiguration(setOf(R.id.splashFragment, R.id.onboardingFragment, R.id.homeFragment))

setupActionBarWithNavController(findNavController(R.id.nav_host), appBarConfiguration)
斜瑞
2023-03-14

您可以使用NavigationUI. setupActionBarWitNavController()将您的ActionBar连接到NavController。这通常在您的活动中完成,就在您调用setSupport ActionBar()之后:

supportActionBar = findViewById<Toolbar>(R.id.toolbar)

// Get the NavController for your NavHostFragment
val navController = findNavController(R.id.nav_host_fragment)

// Set up the ActionBar to stay in sync with the NavController
setupActionBarWithNavController(navController)

2018年谷歌I/O大会上的导航演讲介绍了这种方法。

 类似资料:
  • 我有一个jetpack导航图设置,带有底部导航和一个动作栏。底部导航有3个选项卡。其中1个选项卡有一个详细的片段,我想在操作栏中显示后退箭头。 在MainActivity中,我添加了: 这将在每个选项卡上显示后退按钮 除非用户被导航到非顶级片段,否则如何防止显示后退按钮?是否有方法检测此特定导航何时发生?如果是这样,我假设我可以执行之类的操作 此外,有没有办法在子页面上显示自定义的后退箭头?默认箭

  • 我有抽屉布局作为我的活动的基础布局,我正在替换这个抽屉布局中的框架上的两个片段。第一个片段不会添加到片段的后堆栈中。我正在我的活动中显示汉堡包图标(我也想在我的第一个片段的抽屉菜单)。在第二个片段中,我通过禁用了汉堡包图标,并使用启用了后退按钮。 在Resume上的first fragments中,我通过MActionBarDrawerToggle.SetDrawerIndicatorEnable

  • 将android jetpack导航与工具栏和抽屉结合使用是因为根目的地有一个汉堡包菜单图标(用于切换抽屉),在子片段中有一个后退按钮。 在后箭头上打开/关闭子片段时,也会出现动画。 现在的问题是:在我的一个孩子片段中,我设置了一个自定义导航返回按钮 这同样有效,但在结束时出现了一个“小故障”,其中 自定义图标消失 问题: 这个“故障”是一个错误,还是我必须调用setNavigationIcon以

  • 请帮帮我,我已经绕了几个小时了!我设置了一个抽屉菜单和一个工具栏(见下面的代码),我无法让返回/回家功能工作,因为单击它会导致打开抽屉。 这是我的主要活动,在OnCreate期间调用。 以下是我片段的OnCreateView方法中的内容。。。 抽屉菜单工作正常。更改工具栏的标题工作正常。汉堡包图标在片段中更改为向后箭头就好了...然而,每次我按下向后箭头,它都会打开抽屉...有点像抽屉的听众在向后

  • 我有一个使用动作条和导航抽屉的有很多碎片的活动。它已启用“home as up”。我已经实现了正确的逻辑,只有顶层的片段显示动作条抽屉切换图标,其他的片段显示箭头。我通过以下方式实现了这一点: 现在旧的v4支持库ActionBarDrawerToggle被弃用。我已经切换到v7版本和新的以获得材质设计外观。之后,当抽屉打开时,“向上”箭头正确显示,但当执行上述代码时,它完全消失。 是支持库中的一个

  • 我正在尝试将工具栏的后箭头图标与工具栏标题对齐,但没有找到任何有用的方法来执行此操作, 默认情况下,如果您将设置字幕和标题文本,则后退箭头图标将垂直对齐,例如默认设置为中间位置, 我知道我可以通过在工具栏中提供自定义布局来做到这一点,但我想知道是否有任何默认的方法或行为?