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

Xamarin Forms Android:如何基于用户主题设置启动屏背景色(下次生效)

嘿,这个需求完全能实现!我给你梳理下具体的实现步骤,亲测有效:

核心思路:关联主题属性+持久化用户选择

启动屏的背景色完全可以绑定到主题中定义的颜色,关键是要让应用启动时优先加载用户上次选择的主题,而不是默认主题,这样启动屏就能自动适配主题颜色了。

1. 在Android项目中定义带启动屏颜色的主题

首先在Resources/values/styles.xml(如果需要适配深色模式,还可以在values-night/styles.xml中同步定义)里创建多套主题,把启动屏背景色作为主题属性:

<!-- 浅色主题 -->
<style name="AppTheme.Light" parent="Theme.MaterialComponents.Light.NoActionBar">
    <item name="splashBackgroundColor">#FFFFFF</item>
    <item name="android:windowBackground">@drawable/splash_screen</item>
</style>

<!-- 深色主题 -->
<style name="AppTheme.Dark" parent="Theme.MaterialComponents.Dark.NoActionBar">
    <item name="splashBackgroundColor">#000000</item>
    <item name="android:windowBackground">@drawable/splash_screen</item>
</style>

接着修改你的splash_screen.xml(放在Resources/drawable目录下),把背景色引用刚才定义的主题属性:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- 绑定主题中的启动屏颜色属性 -->
    <item android:drawable="?attr/splashBackgroundColor" />
    <!-- 这里放你的启动屏图标或其他元素 -->
    <item>
        <bitmap
            android:gravity="center"
            android:src="@drawable/your_splash_icon" />
    </item>
</layer-list>

2. 持久化用户的主题选择

在Xamarin Forms的共享代码里,用Preferences来保存用户选择的主题类型,比如用户切换主题时执行:

// 保存浅色主题选择
Preferences.Set("SelectedTheme", "Light");
// 保存深色主题选择
Preferences.Set("SelectedTheme", "Dark");

3. 在Android项目中动态加载主题

如果你的应用是用单独的SplashActivity作为启动页,就在SplashActivity的OnCreate方法中,先读取用户保存的主题,再设置主题后启动主页面:

[Activity(MainLauncher = true, NoHistory = true)]
public class SplashActivity : AppCompatActivity
{
    protected override void OnCreate(Bundle savedInstanceState)
    {
        // 读取用户上次选择的主题,默认用浅色
        var selectedTheme = Preferences.Get("SelectedTheme", "Light");
        
        // 动态设置对应主题
        if (selectedTheme == "Dark")
        {
            SetTheme(Resource.Style.AppTheme_Dark);
        }
        else
        {
            SetTheme(Resource.Style.AppTheme_Light);
        }
        
        base.OnCreate(savedInstanceState);
        // 跳转到主页面
        StartActivity(new Intent(this, typeof(MainActivity)));
    }
}

如果你的应用没有单独的SplashActivity,直接在MainActivity中设置主题:

protected override void OnCreate(Bundle savedInstanceState)
{
    // 先加载用户主题
    var selectedTheme = Preferences.Get("SelectedTheme", "Light");
    SetTheme(selectedTheme == "Dark" ? Resource.Style.AppTheme_Dark : Resource.Style.AppTheme_Light);
    
    // 再执行后续初始化
    base.OnCreate(savedInstanceState);
    Xamarin.Essentials.Platform.Init(this, savedInstanceState);
    global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
    LoadApplication(new App());
}

4. 注意事项

  • 确保所有主题中都定义了splashBackgroundColor属性,避免启动时出现找不到属性的崩溃;
  • 如果使用Android 12+的官方SplashScreen API,核心逻辑不变,只是主题中需要适配android:windowSplashScreenBackground这类属性,同样可以用主题属性绑定;
  • 测试时记得切换主题后完全退出应用再重启,才能看到启动屏颜色的变化。

内容的提问来源于stack exchange,提问作者Jim Marquardt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:04:04