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

qqrboqgw  于 2022-11-27  发布在  Android
关注(0)|答案(2)|浏览(173)

我正在Mac上使用Xamarin表单构建一个跨平台应用程序,使用Mac的可视化代码。
我需要能够更改状态栏文本和背景颜色的iOS和Android版本的应用程序。
我尝试了James Montemagno视频中的解决方案。https://www.youtube.com/watch?v=GKJRR8_DSSs
所以每件事都是好的,直到我们需要使用这个代码window.DecorView.SystemUiVisibility这个代码是过时的,Visual Studio不提供任何提示,我可以用什么代替.我试着找到,但我得到的是Android本机相关信息1 .
我真的希望我不必使用“原生”代码来做一些移动的应用程序开发中的基本事情。我知道使用Shell类将允许我使用尽可能少的“原生”代码,如果可能的话,我真的希望避免编写任何原生代码。
上下文:我需要设置Android版本的应用程序,使其具有白色状态栏和黑色文本。此外,我有1个黑色背景图像的页面,所以在这个页面上,我需要状态栏是透明的,并使用白色的前景颜色。
那么,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
                }
            }
        }
    }
5lwkijsr

5lwkijsr1#

如果要确保在设置状态栏颜色时状态栏文本和图标保持清晰,则可以执行下列操作:

public void SetSystemBarColor(Color color, bool lightStatusBarTheme)
{
    Window?.SetStatusBarColor(color);

    var statusBarFlags = lightStatusBarTheme ? (int)WindowInsetsControllerAppearance.LightStatusBars : 0;
    Window?.InsetsController?.SetSystemBarsAppearance(statusBarFlags, (int)WindowInsetsControllerAppearance.LightStatusBars);
}

然后在“活动”中按如下方式调用它:

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

//white status bar
SetSystemBarColor(Color.White, true);
fdbelqdn

fdbelqdn2#

由于 systemUiVisibility 属性已过时,您可以使用 WindowInsetsControllerCompat。请参阅jamesmontemagno's MyCoffeeApp并尝试以下代码:

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

这意味着如果将 AppearanceLightStatusBars 设置为true,则会将状态栏的前景色更改为浅色,以便可以清楚地读取状态栏上的项目。
有关详细信息,请参见WindowInsetsControllerCompat
希望对你有用。

相关问题