Xamarin.Forms - 更改状态栏颜色

Xamarin.Forms - Change StatusBar Color

我搜索了但找不到是否可以从我的可移植代码更改每个平台的 StatusBar 颜色? (对于 Android, iOS & WinPhone 8.1

public App()
{
    // Change the StatusBar color
    MainPage = new MainPageUser();
}

多年后我会回到这个答案来修复它,因为我的答案是错误的,即使它已被接受为正确答案。我现在已经修好了。

当时我误读了想要更改导航栏或它在 Android 中的工作方式不同的问题。

我认为至少这是一个更好的答案,并且应该更好地帮助更改 Android 和 iOS 中导航栏的颜色。

将此代码添加到您的 Xamarin.Forms 项目

public interface IStatusBarPlatformSpecific
{
  void SetStatusBarColor(Color color);
}

将此 class 添加到您的 Android 项目中

[assembly: Dependency(typeof(MyDemo.Droid.CustomRenderers.Statusbar))]
namespace MyDemo.Droid.CustomRenderers
{
    public class Statusbar : IStatusBarPlatformSpecific
    {
       public Statusbar()
       {
       }

       public void SetStatusBarColor(Color color)
       {
         // The SetStatusBarcolor is new since API 21
         if (Build.VERSION.SdkInt >= BuildVersionCodes.Lollipop)
        {
          var androidColor = color.AddLuminosity(-0.1).ToAndroid();
         //Just use the plugin
 CrossCurrentActivity.Current.Activity.Window.SetStatusBarColor(androidColor);
         }
         else
         {
          // Here you will just have to set your 
          // color in styles.xml file as shown below.
         }
       }
   }
}

将此 CurrentActivityPlugin 添加到您的项目中

现在您可以像这样更改 Forms 项目中的颜色

var statusbar = DependencyService.Get<IStatusBarPlatformSpecific>();
statusbar.SetStatusBarColor(Color.Green);

注意上面的else语句。如果您使用的是早于 21 的构建版本,您需要将颜色硬编码到 Android 项目中的 styles.xml,就像这样

<?xml version="1.0" encoding="utf-8" ?>
<resources>
   <style name="MainTheme.Base" parent="Theme.AppCompat.Light.DarkActionBar">  
      <item name="android:statusBarColor">#544054</item>  
   </style>
</resources>

对于iOS其相似

将此添加到您的 Info.plist (more docs here)

<key>UIStatusBarStyle</key>
<string>UIStatusBarStyleLightContent</string>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>

并将此代码添加到 StatusBar iOS 版本中的 SetStatusBarColor 方法 class

UIView statusBar = UIApplication.SharedApplication.ValueForKey(
new NSString("statusBar")) as UIView;
 
 if (statusBar != null && statusBar.RespondsToSelector(
 new  ObjCRuntime.Selector("setBackgroundColor:")))
 {
   // change to your desired color 
   statusBar.BackgroundColor = Color.FromHex("#7f6550").ToUIColor(); 
 }

如果有人感兴趣,我在 how to set the color of the statusbar from Xamarin.Forms 上写了一篇更详细的博客 post。它只讨论 Android 和 iOS 但应该让您了解如何使用其他平台。

我相信你最好写一点 platform-specific 代码:

对于Android:

在你 MainActivity.cs 的 Droid 项目上,就在

之后
LoadApplication(new App());

在覆盖的 OnCreate 方法中,添加:

Window.SetStatusBarColor(Android.Graphics.Color.Argb(255, 0, 0, 0));

像这样:

protected override void OnCreate(Bundle bundle)
        {
            TabLayoutResource = Resource.Layout.Tabbar;
            ToolbarResource = Resource.Layout.Toolbar;

            base.OnCreate(bundle);

            global::Xamarin.Forms.Forms.Init(this, bundle);            
            LoadApplication(new App());
            Window.SetStatusBarColor(Android.Graphics.Color.Argb(255, 0, 0, 0)); //here
        }

Android 的另一个选项:更改文件 \Resources\values\styles.xml 中的颜色(Android 项目)。

<item name="colorPrimaryDark">#00FF00</item>

使用这种方法,您可以在每个页面上更改它。

Application.Current.MainPage.SetValue(NavigationPage.BarBackgroundColorProperty, Color.Black);

也许我不明白这个问题,但我希望这会有所帮助。

在四处搜索试图找出如何更改 iPhoneX 状态栏颜色(凹口后面的位)后,我发现它会根据 BackroundColor[=23 自动设置自己=] 的根 ContentPage.

所以在 Xaml 中就这么简单:

   <ContentPage.BackgroundColor>
        <OnPlatform x:TypeArguments="Color"
                    iOS="Navy"
                    Android="Yellow"
                    />
    </ContentPage.BackgroundColor>

我基本上使用这里的一个答案中描述的方法:,但是通过给你一个代码片段来稍微修改它,我已经专注于你的个人问题(至少我想想!)

这对我有用。

在App.xaml

 <Color x:Key="navBarRed">#AA0000</Color>
 <Color x:Key="navBarBlue">#F4721C</Color>
 <Color x:Key="navBarColour">#F4721C</Color>
 <Style TargetType="NavigationPage">
     <Setter Property="BarBackgroundColor" Value="{DynamicResource navBarColour}"/>
 </Style>

然后当你想改变颜色时:

if (Condition == true)
    App.Current.Resources["navBarColour"] = App.Current.Resources["navBarBlue"];
else
    App.Current.Resources["navBarColour"] = App.Current.Resources["navBarRed"];

在最新版本的 Xamarin 上,您不再需要粗略的插件,而是可以在 Android 上执行以下操作:

var androidColor = color.ToAndroid();               
Xamarin.Essentials.Platform.CurrentActivity.Window.SetStatusBarColor(androidColor);

所以Android中的完整依赖示例:

using System;
using Android.OS;
using WikiSpiv.Droid.Extras;
using WikiSpiv.Extras;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;

[assembly: Dependency(typeof(Statusbar))]
namespace WikiSpiv.Droid.Extras
{
    public class Statusbar : IStatusBarPlatformSpecific
    {
        public Statusbar()
        {
        }

        public void SetStatusBarColor(Color color)
        {
            if (Build.VERSION.SdkInt >= BuildVersionCodes.Lollipop)
            {
                var androidColor = color.ToAndroid();
                Xamarin.Essentials.Platform.CurrentActivity.Window.SetStatusBarColor(androidColor);
            }
        }
    }

}

在表格中:

using System;
using Xamarin.Forms;

namespace WikiSpiv.Extras
{
    public interface IStatusBarPlatformSpecific
    {
        public void SetStatusBarColor(Color color);
    }
}

也可以这样称呼:

var statusbar = DependencyService.Get<IStatusBarPlatformSpecific>();
statusbar.SetStatusBarColor(Color.Green);

第 1 步. 在共享中添加接口 class

    public interface IStatusBarColor
        {
            void changestatuscolor(string color);
        }

步骤 2. 在 main activity 注入依赖并实现接口

[assembly: Dependency(typeof(ETCrewReport.Droid.MainActivity))]
 public class MainActivity : FormsAppCompatActivity, IStatusBarColor  
    {
      ......
      ...
      public static Context context;

        protected override void OnCreate(Bundle bundle)
        {
        }
 public void changestatuscolor(string color)
        {
            try
            {
                if (Build.VERSION.SdkInt >= BuildVersionCodes.Lollipop)
                {
                    var c = MainActivity.context as FormsAppCompatActivity;
                    c?.RunOnUiThread(() => c.Window.SetStatusBarColor(Android.Graphics.Color.ParseColor(color)));
                }
            }
            catch (Exception ex)
            {
                 
            }

    }
    

第 3 步。获取所需 xaml.cs 文件中对 OnAppearing 方法的依赖关系

protected async override void OnAppearing()
        {
            try
            {
                DependencyService.Get<IStatusBarColor>().changestatuscolor(Color.Black.ToHex());
            }
            catch (Exception ex)
            {
                throw;
            }
        } 

在你的 android

MainActivity.cs

之后

LoadApplication(new App());

添加这一行

Window.SetStatusBarColor(Android.Graphics.Color.Argb(255, 62, 102, 226));

颜色代码为 Argb 格式(Alpha、红色、绿色、蓝色) 您可以使用 0-255 的 alpha 百分比更改强度 下面提到的可能会帮助您处理 alpha 颜色的不透明度 用于 50% alpha 使用的黑色 Window.SetStatusBarColor(Android.Graphics.Color.Argb(80, 0, 0, 0));

  • 100% - FF
  • 95% - F2
  • 90% - E6
  • 85% - D9
  • 80% - CC
  • 75% - 高炉
  • 70% - B3
  • 65% - A6
  • 60% - 99
  • 55% - 8C
  • 50% - 80
  • 45% - 73
  • 40% - 66
  • 35% - 59
  • 30% - 4D
  • 25% - 40
  • 20% - 33
  • 15% - 26
  • 10% - 1A
  • 5% - 0D
  • 0% - 00