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

Xamarin.Forms Android/iOS状态栏前景/背景色设置问题(API30)

Xamarin.Forms Android 状态栏设置:替代废弃的 SystemUiVisibility 方案

核心替代方案

针对API 30+,废弃的window.DecorView.SystemUiVisibility可以用WindowInsetsController来替代,以下是修改后的完整实现:

1. 共享项目接口(保持不变)

using System;
using System.Drawing;

namespace MyApp.Helpers
{
    public interface IEnvironment
    {
        void SetStatusBarColor(Color color, bool darkStatusBarTint);
    }
}

2. Android端实现(替换废弃代码)

using System;
using System.Drawing;
using Android.OS;
using MyApp.Helpers;
using Xamarin.Essentials;
using Xamarin.Forms;
using Color = System.Drawing.Color;

[assembly: Dependency(typeof(MyApp.Droid.Environment))]
namespace MyApp.Droid
{
    public class Environment : IEnvironment
    {
        public void SetStatusBarColor(Color color, bool darkStatusBarTint)
        {
            if (Build.VERSION.SdkInt < Android.OS.BuildVersionCodes.Lollipop)
                return;

            var activity = Platform.CurrentActivity;
            var window = activity.Window;
            
            window.AddFlags(Android.Views.WindowManagerFlags.DrawsSystemBarBackgrounds);
            window.ClearFlags(Android.Views.WindowManagerFlags.TranslucentStatus);
            window.SetStatusBarColor(color.ToPlatformColor());

            if (Build.VERSION.SdkInt >= Android.OS.BuildVersionCodes.M)
            {
                if (Build.VERSION.SdkInt >= Android.OS.BuildVersionCodes.R)
                {
                    // API 30+ 替代方案
                    var insetsController = window.InsetsController;
                    if (insetsController != null)
                    {
                        if (darkStatusBarTint)
                        {
                            insetsController.SetSystemBarsAppearance((int)Android.Views.WindowInsetsControllerAppearance.LightStatusBars, 
                                                                     (int)Android.Views.WindowInsetsControllerAppearance.LightStatusBars);
                        }
                        else
                        {
                            insetsController.SetSystemBarsAppearance(0, 
                                                                     (int)Android.Views.WindowInsetsControllerAppearance.LightStatusBars);
                        }
                    }
                }
                else
                {
                    // API 23-29 兼容旧逻辑
                    var flag = Android.Views.SystemUiFlags.LightStatusBar;
                    window.DecorView.SystemUiVisibility = darkStatusBarTint ? flag : 0;
                }
            }
        }
    }
}

针对需求的调用示例

默认页面(白色状态栏+黑色文字)

在App.xaml.cs的OnStart方法或者主页面的OnAppearing中调用:

DependencyService.Get<IEnvironment>().SetStatusBarColor(Color.White, true);

全屏黑背景页面(透明状态栏+白色文字)

在目标页面的OnAppearing中调用:

DependencyService.Get<IEnvironment>().SetStatusBarColor(Color.Transparent, false);

同时建议在OnDisappearing中恢复默认设置,避免影响其他页面:

DependencyService.Get<IEnvironment>().SetStatusBarColor(Color.White, true);

说明

  • 代码兼顾了API23-29和API30+的兼容性,无需额外处理版本判断逻辑
  • 完全基于Xamarin.Forms依赖服务实现,未引入额外原生开发成本

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 20:10:26