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

Android应用状态栏仅重启后随系统主题变更,求实时适配方案

解决Android应用运行时状态栏随系统主题实时更新的问题

问题分析

  • 手动设置Application.Current.UserAppTheme会让应用脱离系统主题跟随逻辑,导致RequestedThemeChanged事件不再触发
  • Android端通过styles.xml配置的状态栏颜色仅在应用启动时加载,系统主题切换时不会自动刷新

解决方案

1. 保持应用跟随系统主题

移除固定UserAppTheme的代码(比如Application.Current.UserAppTheme = AppTheme.Dark;),让应用默认跟随系统主题。若需支持用户手动切换主题,在切换回跟随系统模式时设置:

Application.Current.UserAppTheme = AppTheme.Unspecified;

这样RequestedThemeChanged事件才能在系统主题变更时正常触发。

2. Android端监听主题变更并手动更新状态栏

在Platforms/Android/MainActivity.cs中添加主题变更监听,实时更新状态栏样式:

protected override void OnCreate(Bundle savedInstanceState)
{
    base.OnCreate(savedInstanceState);
    Application.Current.RequestedThemeChanged += OnRequestedThemeChanged;
}

protected override void OnDestroy()
{
    Application.Current.RequestedThemeChanged -= OnRequestedThemeChanged;
    base.OnDestroy();
}

private void OnRequestedThemeChanged(object sender, AppThemeChangedEventArgs e)
{
    // 根据当前主题获取状态栏颜色资源ID
    int colorResId = Application.Current.RequestedTheme == AppTheme.Dark 
        ? Resource.Color.status_bar_dark 
        : Resource.Color.status_bar_light;
    var statusBarColor = Resources.GetColor(colorResId, Theme);
    
    // 更新状态栏背景色
    Window.SetStatusBarColor(new Android.Graphics.Color(statusBarColor));
    
    // 适配状态栏文字/图标颜色(深色主题下显示浅色图标,浅色主题下显示深色图标)
    var decorView = Window.DecorView;
    decorView.SystemUiVisibility = Application.Current.RequestedTheme == AppTheme.Dark 
        ? StatusBarVisibility.LightStatusBar 
        : StatusBarVisibility.Visible;
}

3. 配置主题对应的状态栏颜色

在Platforms/Android/Resources/values/colors.xml中定义浅色主题的状态栏颜色:

<color name="status_bar_light">#FFFFFF</color>

在Platforms/Android/Resources/values-night/colors.xml中定义深色主题的状态栏颜色:

<color name="status_bar_dark">#121212</color>

同时确保应用启动时的初始样式配置正确(用于启动时的状态栏初始状态):

<!-- values/styles.xml -->
<style name="MainTheme" parent="MainTheme.Base">
    <item name="android:statusBarColor">@color/status_bar_light</item>
</style>

<!-- values-night/styles.xml -->
<style name="MainTheme" parent="MainTheme.Base">
    <item name="android:statusBarColor">@color/status_bar_dark</item>
</style>

4. 验证事件触发逻辑

在App.xaml.cs的启动方法中调用主题监听逻辑,确保事件正常触发:

protected override void OnStart()
{
    ChangeTheme();
}

private void ChangeTheme()
{
    Application.Current.RequestedThemeChanged += (s, a) =>
    {
        Console.WriteLine($"当前主题:{Application.Current.RequestedTheme}");
    };
}

完成以上配置后,系统主题切换时,应用状态栏会实时更新样式,无需重启应用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 00:15:32