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

如何让Android应用启动时首个Activity自动应用深色模式?

解决方案

问题根源

你已经读取了SharedPreferences中的深色模式配置,但未在MainActivity启动时立即应用该配置——仅在打开设置页时才触发主题切换,导致应用重启后,MainActivity需等待进入设置页才会生效深色模式。


具体修改方案

1. 修复MainActivity:启动时立即加载主题配置

必须在setContentView()之前调用主题设置方法,否则主题无法生效。修改后的代码如下:

public class MainActivity extends AppCompatActivity {
    Button button;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // 优先读取配置并设置主题,务必放在super.onCreate和setContentView之前
        SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
        boolean isDarkMode = sharedPreferences.getBoolean("darkMode", false);
        AppCompatDelegate.setDefaultNightMode(isDarkMode ? AppCompatDelegate.MODE_NIGHT_YES : AppCompatDelegate.MODE_NIGHT_NO);
        
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        button = findViewById(R.id.button);
        button.setOnClickListener(v -> startActivity(new Intent(MainActivity.this, Settings.class)));
    }
}

2. 优化设置页:监听开关变化并实时更新主题

原设置页仅在初始化时设置主题,未监听开关切换事件。添加监听后,开关变动时会立即更新主题,且SwitchPreference会自动将状态同步到SharedPreferences。修改后的代码:

public class MySettingsFragment extends PreferenceFragmentCompat {
    @Override
    public void onCreatePreferences(@Nullable Bundle savedInstanceState, @Nullable String rootKey) {
        setPreferencesFromResource(R.xml.preferences, rootKey);
        SwitchPreference darkModeSwitch = findPreference("darkMode");
        
        // 初始化时同步主题状态
        updateTheme(darkModeSwitch.isChecked());
        
        // 监听开关状态变更
        darkModeSwitch.setOnPreferenceChangeListener((preference, newValue) -> {
            boolean isChecked = (boolean) newValue;
            updateTheme(isChecked);
            return true; // 允许将新值保存到SharedPreferences
        });
    }
    
    private void updateTheme(boolean isDarkMode) {
        int nightMode = isDarkMode ? AppCompatDelegate.MODE_NIGHT_YES : AppCompatDelegate.MODE_NIGHT_NO;
        AppCompatDelegate.setDefaultNightMode(nightMode);
    }
}

3. 确保preferences.xml配置正确

确认res/xml/preferences.xml中的SwitchPreference key为darkMode,示例配置:

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
    <SwitchPreference
        android:key="darkMode"
        android:title="深色模式"
        android:summary="开启/关闭深色模式"
        android:defaultValue="false"/>
</PreferenceScreen>

原理说明

  • AppCompatDelegate.setDefaultNightMode()是全局设置方法,所有后续启动的Activity都会自动应用该模式;
  • 在MainActivity的onCreate()最开始调用该方法,能保证首次启动就加载保存的主题配置;
  • SwitchPreference默认与PreferenceManager.getDefaultSharedPreferences()绑定,无需手动编写SharedPreferences的编辑逻辑。

内容的提问来源于stack exchange,提问作者Ayoub Bentameur

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 01:40:22