修改AppTheme后应用启动崩溃、Toolbar显示异常等问题求助
问题修复全方案
首先最初的启动崩溃根因是切换到Theme.MaterialComponents.DayNight.NoActionBar主题后,系统不再提供默认ActionBar,原有代码调用getSupportActionBar()返回空指针,你添加自定义Toolbar并调用setSupportActionBar()的修复方向是正确的,后续6个问题的修复方案如下:
1. 自定义Toolbar无法显示
- 检查根布局约束:如果使用ConstraintLayout作为根布局,需给Toolbar添加顶部约束
app:layout_constraintTop_toTopOf="parent",下方内容区域(如Fragment容器、NestedScrollView等)添加顶部约束app:layout_constraintTop_toBottomOf="@id/toolbarHome",避免内容覆盖Toolbar - 检查Toolbar基础配置:确保设置了正确高度
android:layout_height="?attr/actionBarSize",且背景色与状态栏/内容区颜色不重复 - 排查Window标识:移除Activity主题或代码中设置的
windowFullscreen、layoutInScreen等全屏相关标识,避免Toolbar被状态栏覆盖
2. BottomNavigationView始终保持白色
直接在布局文件中给BottomNavigationView设置固定背景,关闭日夜间色调适配:
<com.google.android.material.bottomnavigation.BottomNavigationView android:id="@+id/bottom_nav" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@android:color/white" app:itemBackground="@android:color/white" app:itemIconTint="@color/bottom_nav_item_color_selector" <!-- 可自定义图标颜色选择器,不受日夜间影响 --> app:itemTextColor="@color/bottom_nav_item_color_selector" />
3. HomeFragment的onCreateOptionsMenu逻辑失效
需在Fragment的onViewCreated生命周期中主动开启菜单挂载权限,同时绑定Toolbar与导航控制器:
// HomeFragment.kt 代码示例 override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) // 开启Fragment菜单挂载权限 setHasOptionsMenu(true) } // 如果使用Navigation组件,在Activity onCreate中绑定Toolbar与NavController NavigationUI.setupWithNavController(binding.toolbarHome, navController)
4. 菜单图标始终保持白色
给自定义Toolbar设置专属主题覆盖,强制图标颜色为白色,不受日夜间模式影响:
首先在styles.xml中新增Toolbar主题:
<style name="ThemeOverlay.Toolbar.WhiteIcons" parent="ThemeOverlay.MaterialComponents.Dark.ActionBar"> <!-- 控制菜单图标、溢出图标颜色 --> <item name="colorControlNormal">@android:color/white</item> <!-- 控制溢出菜单文字颜色 --> <item name="android:textColorSecondary">@android:color/white</item> </style>
然后给布局中的Toolbar添加主题属性:
<androidx.appcompat.widget.Toolbar android:id="@+id/toolbarHome" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" app:titleTextColor="@android:color/white" app:theme="@style/ThemeOverlay.Toolbar.WhiteIcons" />
5. FragmentContainerView替换后无NavController报错
该问题是因为FragmentContainerView的加载时机晚于普通fragment标签,不能在Activity的onCreate中直接用Navigation.findNavController()获取,需通过NavHostFragment获取:
// HomeActivity onCreate 代码示例 NavHostFragment navHostFragment = (NavHostFragment) getSupportFragmentManager().findFragmentById(R.id.nav_host_container); NavController navController = navHostFragment.getNavController(); // 后续绑定Toolbar、BottomNavigationView都使用该navController实例即可
6. 菜单项、溢出图标颜色始终为黑色
该问题的修复方案和第4点完全一致,colorControlNormal属性会统一控制Toolbar的所有菜单图标、返回按钮、溢出按钮的颜色,按第4点配置后即可统一改为白色,如需单独调整溢出菜单的背景色,可在上述自定义Toolbar主题中新增属性:
<item name="android:colorBackground">@color/black</item> <!-- 溢出菜单背景改为黑色,按需调整 -->
内容的提问来源于stack exchange,提问作者Codist
相关产品推荐
相关产品推荐

