Android深色/浅色模式切换异常:开启深色模式时Toolbar显示应用名称问题排查
解决深色模式下Toolbar显示应用名称的问题
我帮你梳理了代码里的问题点,咱们一步步来搞定这个异常:
1. 统一深色/浅色主题的命名
你当前的浅色主题叫Theme.Light,但night文件夹里的深色主题叫Theme.Dark——这会让AppCompat在切换深色模式时找不到对应名称的主题,从而 fallback 到默认的AppCompat主题(默认主题自带ActionBar,所以会显示应用名称)。
修改方法:
- 修改
themes.xml(默认文件夹)里的主题名称,和night文件夹保持一致,比如统一叫Theme.MyApplication:<style name="Theme.MyApplication" parent="Theme.AppCompat.DayNight.NoActionBar"> <!-- 你的浅色主题属性... --> </style> - 同步修改
themes.xml/night里的深色主题名称:<style name="Theme.MyApplication" parent="Theme.AppCompat.DayNight.NoActionBar"> <!-- 你的深色主题属性... --> </style> - 最后在
AndroidManifest.xml里把应用默认主题设为这个统一名称:<application ... android:theme="@style/Theme.MyApplication"> ... </application>
2. 切换主题后重启Activity生效
你当前的代码只设置了夜间模式,但没有触发Activity重建,这会导致主题切换不彻底,UI状态(比如Toolbar)出现异常。
修改SettingsFragment的代码,在设置完模式后重启Activity:
themePreference.setOnPreferenceChangeListener((preference, newValue) -> { if(newValue.equals("light_mode")) AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO); if(newValue.equals("dark_mode")) AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES); if(newValue.equals("system_default")) AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM); // 重启Activity让主题完全生效 if(getActivity() != null) { getActivity().recreate(); } return true; });
3. 确保自定义Toolbar隐藏标题
因为你用的是NoActionBar主题,应该是自定义了Toolbar,可在布局或代码里明确隐藏标题:
- 布局文件中给Toolbar添加属性:
<androidx.appcompat.widget.Toolbar ... app:title="" app:titleEnabled="false"/> - 或者在Activity的
onCreate里设置:Toolbar toolbar = findViewById(R.id.toolbar); setSupportActionBar(toolbar); if(getSupportActionBar() != null) { getSupportActionBar().setDisplayShowTitleEnabled(false); }
按这几步操作后,深色模式下Toolbar就不会再显示应用名称了。
内容的提问来源于stack exchange,提问作者Emil Mester
相关产品推荐
相关产品推荐

