使用NavGraph导航时如何启用顶部返回箭头返回上一级Fragment
问题描述
我使用NavGraph(Navigation UI组件)在不同Fragment之间进行跳转,设备物理返回键可正常完成导航,但不知道如何激活应用顶部的返回箭头,实现返回上一级Fragment的功能。
现有配置
NavGraph配置
<?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
相关产品推荐
相关产品推荐

