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
相关产品推荐
相关产品推荐

