我正在使用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
希望它对你有用。