Xamarin表单Android / iOS状态栏前/背景颜色



我正在使用mac上的Visual code构建一个使用Xamarin表单的跨平台应用程序。

我需要能够在iOS和Android版本的APP上更改状态栏文本和背景颜色。

我尝试了James Montemagno视频中的解决方案。https://www.youtube.com/watch?v=GKJRR8_DSSs

所以一切都很好,直到我们需要使用这个代码window.DecorView.SystemUiVisibility这段代码已经被弃用了,Visual Studio也没有提示我可以用什么来代替。我试图找到,但所有我得到的是Android原生相关信息1.

我真希望我不用使用"native"在移动应用程序开发中编写一些基本的代码。我知道使用Shell类将允许我使用最少量的"原生"语言。可能的代码,如果可能的话,真的希望避免编写任何本机代码。

上下文:我需要设置Android版本的应用程序,使它有一个白色的状态栏和黑色的文本。此外,我有一个页面的黑色背景图像采取整个视图,所以在这个页面上,我需要的状态栏是透明的,并使用白色的前景色。

那么什么可以代替window.DecorView.SystemUiVisibility = darkStatusBarTint ? flag : 0; ??

应用程序瞄准Android API 30.

这是视频

中的代码
From main project stub
    using System;
    using System.Drawing;
    
    namespace MyApp.Helpers
    {
        public interface IEnvironment
        {
            void SetStatusBarColor(Color color, bool darkStatusBarTint);
        }
    }
From android stub
    using System;
    using System.Drawing;
    using System.Runtime.CompilerServices;
    using Android.OS;
    using EGrid18.Helpers;
    using Xamarin.Essentials;
    using Xamarin.Forms;
    using Color = System.Drawing.Color;
    using DependencyAttribute = Xamarin.Forms.DependencyAttribute;
    
    [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)
                {
                    var flag = (Android.Views.StatusBarVisibility)Android.Views.SystemUiFlags.LightStatusBar;
    #pragma warning disable CS0618 // Le type ou le membre est obsolète
                    //problen is here
                    window.DecorView.SystemUiVisibility = darkStatusBarTint ? flag : 0;
    #pragma warning restore CS0618 // Le type ou le membre est obsolète
                }
            }
        }
    }

如果您想确保在设置状态栏颜色时状态栏文本和图标保持清晰,那么您可以这样做:

public void SetSystemBarColor(Color color, bool lightStatusBarTheme)
{
    Window?.SetStatusBarColor(color);
    var statusBarFlags = lightStatusBarTheme ? (int)WindowInsetsControllerAppearance.LightStatusBars : 0;
    Window?.InsetsController?.SetSystemBarsAppearance(statusBarFlags, (int)WindowInsetsControllerAppearance.LightStatusBars);
}

然后在Activity中按如下方式调用:

//black status bar
SetSystemBarColor(Color.Black, false);
//white status bar
SetSystemBarColor(Color.White, true);

由于systemUiVisibility属性已弃用,您可以使用WindowInsetsControllerCompat。参考jamesmontemagno的MyCoffeeApp并尝试以下代码:

WindowCompat.GetInsetsController(window, window.DecorView).AppearanceLightStatusBars = darkStatusBarTint;

这意味着如果设置 appearance elightstatusbars 为true,那么将状态栏的前景色更改为浅色,以便可以清楚地阅读状态栏上的项目。

有关更多信息,您可以查看winsetscontrollercompat

希望它对你有用。

最新更新