Fragment返回Navigation Drawer Activity:返回导航实现及自定义Toolbar不显示问题
嘿,我之前也碰到过类似的Toolbar不显示的问题,大概率是Fragment切换时Toolbar的状态没处理好,或者导航组件的配置有问题。给你几个排查和解决的方向:
1. 检查Fragment切换时是否隐藏了Toolbar
很多时候我们在Fragment里会为了沉浸式布局或者自定义需求,手动隐藏Activity的Toolbar,比如在Fragment的onViewCreated里写了:
(activity as AppCompatActivity).supportActionBar?.hide()
那返回的时候别忘了在Fragment的onDestroyView或者onPause里把它显示回来:
override fun onDestroyView() { super.onDestroyView() (activity as AppCompatActivity).supportActionBar?.show() }
如果是用的自定义Toolbar(不是系统默认的ActionBar),直接找到Toolbar实例调用visibility = View.VISIBLE即可。
2. 确认Navigation组件的返回栈配置
如果你用的是Jetpack Navigation,检查导航图里的跳转动作是不是用了popUpTo或者popUpToInclusive,导致返回时Activity的Toolbar状态被意外重置。另外,确保Activity的onSupportNavigateUp()正确实现了导航抽屉的逻辑:
override fun onSupportNavigateUp(): Boolean { val navController = findNavController(R.id.nav_host_fragment_content_main) return NavigationUI.navigateUp(navController, drawerLayout) || super.onSupportNavigateUp() }
同时,在设置Toolbar和导航组件关联的时候,可以在Activity的onResume()里重新调用绑定方法,保证返回时Toolbar能正确初始化:
private fun setupToolbar() { setSupportActionBar(toolbar) NavigationUI.setupActionBarWithNavController(this, navController, drawerLayout) } override fun onResume() { super.onResume() setupToolbar() }
3. 检查DrawerLayout的状态
有时候导航抽屉未完全关闭会导致Toolbar被遮挡,你可以在Activity的onBackPressed()里先处理抽屉关闭逻辑,再处理Fragment返回:
override fun onBackPressed() { if (drawerLayout.isDrawerOpen(GravityCompat.START)) { drawerLayout.closeDrawer(GravityCompat.START) } else { super.onBackPressed() } }
如果是用AndroidX的OnBackPressedDispatcher,也可以用类似的回调处理:
val callback = object : OnBackPressedCallback(true) { override fun handleOnBackPressed() { if (drawerLayout.isDrawerOpen(GravityCompat.START)) { drawerLayout.closeDrawer(GravityCompat.START) } else { isEnabled = false requireActivity().onBackPressedDispatcher.onBackPressed() } } } requireActivity().onBackPressedDispatcher.addCallback(viewLifecycleOwner, callback)
4. 排查自定义Toolbar的布局问题
如果你的Toolbar是自定义布局,检查一下它的layout_height、layout_gravity是否设置正确,有没有被其他View覆盖。另外,确保Activity的布局结构里,Toolbar处于DrawerLayout的主内容区最顶部,不会被Fragment布局遮挡,比如正确的结构应该是:
<androidx.drawerlayout.widget.DrawerLayout> <!-- 主内容区 --> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <com.google.android.material.appbar.MaterialToolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" ... /> <fragment android:id="@+id/nav_host_fragment" android:layout_width="match_parent" android:layout_height="match_parent" ... /> </LinearLayout> <!-- 导航抽屉 --> <com.google.android.material.navigation.NavigationView android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="start" ... /> </androidx.drawerlayout.widget.DrawerLayout>
如果这些方法都没解决问题,建议你把导航抽屉切换Fragment的代码贴出来,这样能更精准地定位问题~
内容的提问来源于stack exchange,提问作者Aayush Kumar

