You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Studio中Kotlin无法切换主题的问题求助

主题切换后Toolbar样式没变化?看这几个修复点

问题出在哪?

  • 主题白设置了:你在SettingsFragment里设置主题后马上调用recreate(),但Activity重建时会重新读取Manifest里的默认主题,之前的设置直接失效。
  • 硬编码颜色盖过主题:Toolbar和AppBarLayout都写死了背景色(比如Toolbar的@color/white),不管主题怎么切换,固定颜色都不会改变。
  • 启动时没加载保存的主题:Activity重建时没读取SharedPreferences里存的主题偏好,还是用了Manifest的默认主题。

一步一步修复

1. 把主题设置移到Activity启动最开头

修改MainActivity,在super.onCreate和setContentView之前就读取保存的主题并设置,这样Activity重建时才会生效:

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        // 先加载主题,再执行后续初始化
        val sharedPref = PreferenceManager.getDefaultSharedPreferences(this)
        when(sharedPref.getString("theme", "light")) {
            "light" -> setTheme(R.style.Theme_AdvancedShoppingList_Light)
            "dark" -> setTheme(R.style.Theme_AdvancedShoppingList_Dark)
        }
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        
        // 绑定Toolbar到ActionBar
        setSupportActionBar(findViewById(R.id.toolbar))
    }
}

2. 删掉布局里的硬编码颜色,改用主题属性

把activity_main.xml里固定的背景色替换为主题自带的属性,这样主题变化时颜色会自动适配:

<androidx.coordinatorlayout.widget.CoordinatorLayout 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:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="?attr/android:colorBackground" <!-- 使用主题背景色 -->
    tools:context=".MainActivity">

    <com.google.android.material.appbar.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="?attr/colorPrimary"> <!-- 使用主题主色调 -->

        <androidx.appcompat.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="?attr/colorPrimary" <!-- 使用主题主色调 -->
            android:minHeight="100dp"
            android:visibility="visible"
            app:titleTextColor="?attr/colorOnPrimary" <!-- 使用主题适配的文字颜色 -->
            tools:visibility="visible" />

    </com.google.android.material.appbar.AppBarLayout>

    <include
        android:id="@+id/content_main"
        layout="@layout/content_main"
        android:visibility="visible"
        tools:visibility="visible" />

</androidx.coordinatorlayout.widget.CoordinatorLayout>

3. 简化SettingsFragment的逻辑

不用在Fragment里设置主题,只要确保切换选项后触发Activity重建,剩下的交给MainActivity处理:

override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String) {
    Log.d("Code Changed", "Something happened");
    val preference = findPreference<ListPreference>(key)
    if (preference != null && key == "theme") {
        val selectedValue = preference.value
        Log.d("PREFERENCE CHANGED", "It changed to $selectedValue")
        // 直接重建Activity,主题由MainActivity加载
        requireActivity().recreate()
    }
}

4. 补全Dark主题的样式

当前Dark主题属性不全,补充关键属性确保样式完整:

<style name="Theme.AdvancedShoppingList.Dark" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
    <item name="colorPrimary">@color/black</item>
    <item name="colorPrimaryVariant">@color/grey_800</item>
    <item name="colorOnPrimary">@color/white</item>
    <item name="android:colorBackground">@color/grey_900</item>
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
</style>

验证步骤

  1. 切换主题选项,查看日志确认回调触发并重建了Activity
  2. 检查Toolbar的背景色、标题文字颜色是否跟随主题变化
  3. 重启应用,确认上次选择的主题能正常加载

内容的提问来源于stack exchange,提问作者Daniel Nelson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 14:54:58