You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用NavGraph导航时如何启用顶部返回箭头返回上一级Fragment

问题描述

我使用NavGraph(Navigation UI组件)在不同Fragment之间进行跳转,设备物理返回键可正常完成导航,但不知道如何激活应用顶部的返回箭头,实现返回上一级Fragment的功能。
效果示意图

现有配置

<?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/charactersFragment">

    <fragment
        android:id="@+id/charactersFragment"
        android:name="com.example.breakingbad.CharactersFragment"
        android:label="fragment_characters"
        tools:layout="@layout/fragment_characters" >
        <action
            android:id="@+id/action_charactersFragment_to_characterDetailFragment"
            app:destination="@id/characterDetailFragment" />
    </fragment>
    <fragment
        android:id="@+id/characterDetailFragment"
        android:name="com.example.breakingbad.CharacterDetailFragment"
        android:label="fragment_character_detail"
        tools:layout="@layout/fragment_character_detail" />
</navigation>

CharacterDetailFragment 代码

class CharacterDetailFragment : Fragment() {

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

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        return inflater.inflate(R.layout.fragment_character_detail, container, false)
    }
}

初始MainActivity代码

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

        val navController = Navigation.findNavController(this, R.id.fragment)
        NavigationUI.setupActionBarWithNavController(this, navController)
    }
}
解决方案

只需要在MainActivity中重写onSupportNavigateUp()方法,关联NavController的返回逻辑即可,修改后的完整MainActivity代码如下:

class MainActivity : AppCompatActivity() {

    private lateinit var navController: NavController

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

        navController = Navigation.findNavController(this, R.id.fragment)
        NavigationUI.setupActionBarWithNavController(this, navController)
    }

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

逻辑说明

NavigationUI.setupActionBarWithNavController方法只会自动在非起始目的地页面显示顶部返回箭头,但箭头的点击事件默认没有绑定导航逻辑,重写onSupportNavigateUp方法后,点击顶部返回箭头时会触发navController.navigateUp()执行回退操作,和物理返回键的导航逻辑完全一致。

内容的提问来源于stack exchange,提问作者BRDroid

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 17:18:01