Android setSupportActionBar调用后Toolbar不显示问题咨询
Toolbar 不显示及导航抽屉唤起功能修复
按以下顺序核对配置,绝大多数同类问题都能解决:
1. 修正主题配置(styles.xml)
调用setSupportActionBar()使用自定义Toolbar时,必须禁用主题自带的原生ActionBar,否则会出现控件冲突,直接导致自定义Toolbar不渲染。
将应用主题的父类替换为NoActionBar版本,示例:
<style name="Theme.你的应用名" parent="Theme.MaterialComponents.DayNight.NoActionBar"> <!-- 其余自定义主题属性保留即可 --> </style>
禁止使用自带ActionBar的主题父类,包括但不限于Theme.AppCompat.Light.DarkActionBar、Theme.MaterialComponents.DayNight。
2. 修正布局层级
2.1 app_bar_main.xml 布局校验
Toolbar必须放在AppBarLayout容器内,高度不要设为0dp,页面内容区要加滚动行为避免遮挡Toolbar,参考正确写法:
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent"> <com.google.android.material.appbar.AppBarLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:theme="@style/ThemeOverlay.MaterialComponents.Dark.ActionBar"> <androidx.appcompat.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" app:popupTheme="@style/ThemeOverlay.MaterialComponents.Light" /> </com.google.android.material.appbar.AppBarLayout> <!-- 页面主内容(如NavHostFragment)必须加layout_behavior,否则会被Toolbar遮挡 --> <fragment android:id="@+id/nav_host_fragment_content_main" android:name="androidx.navigation.fragment.NavHostFragment" android:layout_width="match_parent" android:layout_height="match_parent" app:defaultNavHost="true" app:layout_behavior="@string/appbar_scrolling_view_behavior" app:navGraph="@navigation/nav_graph" /> </androidx.coordinatorlayout.widget.CoordinatorLayout>
2.2 activity_main.xml 抽屉布局校验
DrawerLayout的子View顺序不能乱:第一个子View必须是包含Toolbar的主内容布局,第二个子View是侧边导航NavigationView,参考结构:
<androidx.drawerlayout.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true"> <!-- 主内容区,第一个子View --> <include android:id="@+id/appBarMain" layout="@layout/app_bar_main" android:layout_width="match_parent" android:layout_height="match_parent" /> <!-- 侧边导航栏,第二个子View,必须指定layout_gravity为start --> <com.google.android.material.navigation.NavigationView android:id="@+id/nav_view" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="start" android:fitsSystemWindows="true" app:headerLayout="@layout/nav_header_main" app:menu="@menu/activity_main_drawer" /> </androidx.drawerlayout.widget.DrawerLayout>
3. 修正MainActivity初始化逻辑
不要只调用setSupportActionBar()就结束,必须完成导航组件和Toolbar、抽屉的绑定,才能正常显示汉堡按钮唤起抽屉,参考正确代码:
class MainActivity : AppCompatActivity() { private lateinit var binding: ActivityMainBinding private lateinit var appBarConfiguration: AppBarConfiguration override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) // 绑定自定义Toolbar setSupportActionBar(binding.appBarMain.toolbar) val navController = findNavController(R.id.nav_host_fragment_content_main) // 将DrawerLayout传入配置,指定顶级目的地显示汉堡菜单按钮 appBarConfiguration = AppBarConfiguration(navController.graph, binding.drawerLayout) // 绑定Toolbar与导航控制器,自动处理按钮状态、点击跳转和抽屉唤起 setupActionBarWithNavController(navController, appBarConfiguration) binding.navView.setupWithNavController(navController) } // 必须重写该方法,否则点击导航按钮无响应 override fun onSupportNavigateUp(): Boolean { val navController = findNavController(R.id.nav_host_fragment_content_main) return navController.navigateUp(appBarConfiguration) || super.onSupportNavigateUp() } }
其他偶发问题排查
- 检查Toolbar是否被设置了
android:visibility="gone"、透明背景,或背景色与页面主色完全一致导致视觉上不可见 - 检查是否在嵌套的Fragment中重复调用
setSupportActionBar,覆盖了Activity的Toolbar配置 - 确认AppBarLayout没有被设置为全透明且elevation为0,导致和页面内容融为一体
内容的提问来源于stack exchange,提问作者ackfloverstow
相关产品推荐
相关产品推荐

