Xamarin.Forms - 更改状态栏颜色

Posted

技术标签:

【中文标题】Xamarin.Forms - 更改状态栏颜色【英文标题】:Xamarin.Forms - Change StatusBar Color 【发布时间】:2016-10-25 21:54:47 【问题描述】:

我搜索但找不到是否可以从我的可移植代码中更改每个平台的状态栏颜色? (对于android, ios & WinPhone 8.1

public App()

    // Change the StatusBar color
    MainPage = new MainPageUser();

【问题讨论】:

您必须为此使用特定于平台的代码。 See 我最近写的关于如何在 WP8.1 上更改颜色的答案。 Android: Window.SetStatusBarColor(Android.Graphics.Color.ParseColor("#FFFFFF")); //or any other hex value 在 MainActivity。在 iOS 上,状态栏颜色取决于导航栏的颜色,因此MainPage = new NavigationPage(new MyPage()) BarBackgroundColor = Color.FromHex("000000"), BarTextColor = Color.White ; 将在导航栏中创建一个黑色导航栏和带有白色文本的状态栏。要更改状态栏中的文本颜色,您必须在 info.plist 中设置 <key>UIStatusBarStyle</key> <string>UIStatusBarStyleBlackTranslucent</string> UIStatusBarStyleBlackTranslucent 表示白色文本 var statusBar = Windows.UI.ViewManagement.StatusBar.GetForCurrentView(); 其中StatusBar-Class 具有BackgroundColorBackgroundOpacityForegroundColor 属性 statusBar.BackgroundOpacity = 1; 很重要,否则它将不起作用 【参考方案1】:

我相信你最好写一点特定于平台的代码:

对于 Android:

在 Droid 项目的 MainActivity.cs 上,紧接着

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
        

【讨论】:

这是正确答案。其余的需要更改导航栏的颜色 - 有时没有导航栏。注意 SetStatusBarColor 仅在 API level 21 and up 中受支持。因此,我们应该在调用 SetStatusBarColor 之前检查这一点。 if (Android.OS.Build.VERSION.SdkInt >= BuildVersionCodes.Lollipop)Window.SetStatusBarColor(...); 感谢美丽的陌生人,这一直困扰着我 iOS 怎么样? 确认这个答案在 2021 年仍然有效。半文盲 C# 开发人员,对 Xamarin 来说是全新的(10 分钟的终身经验),这个答案不仅正确,而且比公认的答案要简洁得多。跨度> 【参考方案2】:

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

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

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

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

public interface IStatusBarPlatformSpecific

  void SetStatusBarColor(Color color);

将此类添加到您的 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 添加到您的项目中

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

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/>

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

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 上写了一篇更详细的博文。它只讨论了 Android 和 iOS,但应该让您了解如何使用其他平台。

【讨论】:

我正在尝试选项 1,但它对我不起作用。颜色保持相同的默认蓝色。 尝试了选项 2,但我的状态栏卡在蓝色。 AFAIK,仅在如果您使用 NavigationBar 时有效。当 NavigationBar=false 时,这不起作用(在我的情况下)。 不使用 NavigationPage 和 NavigationBar 会怎样?我 这是用于导航栏,而不是状态栏,这是问题所在,所以我很惊讶地看到它被标记为已接受的答案......但是为 NavigationBar 堆积... 最简单的非平台特定方法是在 App.xaml 中设置隐式样式: 【参考方案3】:

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

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

【讨论】:

这是在Android中设置状态栏颜色的唯一方法。根据我的经验,没有办法在 Xamarin Forms 中以跨平台方式执行此操作。我很高兴被证明是错误的。 这是比添加语句更优选的方式:Window.SetStatusBarColor(Android.Graphics.Color.Argb(255, 0, 0, 0));来自上一个答案,因为在这种情况下,状态栏会在加载时立即根据需要着色,而在上一个答案中,它在开始时默认为着色,然后重新绘制。如果您的活动加载时间不是即时的,这可能非常明显。 这不起作用,因为您需要响应明暗模式的变化【参考方案4】:

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

在搜索了很多试图找出如何更改 iPhoneX 状态栏颜色(缺口后面的位)之后,我发现它会根据根 ContentPageBackroundColorproperty 自动设置自己.

所以在 Xaml 中就这么简单:

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

我基本上使用此处的答案之一中描述的方法:https://***.com/a/46199029/960691,但是通过给您一个我针对您的个人问题的代码 sn-p 进行了一些修改(至少我认为! )

【讨论】:

这对我有用,当使用 iOS 11 安全区域时。因此,我的内容从状态栏下方开始,但背景颜色延伸到整个页面,包括安全区域之外。【参考方案5】:

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

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

【讨论】:

注意:(在 iOS 上)如果你设置了 HasNavigationBar=false,那么这没有任何效果,至少在我正在测试的情况下。【参考方案6】:

在最新版本的 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);

【讨论】:

这里只设置状态栏背景颜色,不设置状态栏文字颜色【参考方案7】:

Step 1. 在共享类中添加接口

    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;
            
         

【讨论】:

【参考方案8】:

在你的安卓系统中

MainActivity.cs

之后

加载应用程序(新应用程序());

添加这一行

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

颜色代码为 Argb 格式(Alpha、Red、Green、Blue) 您可以使用 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% - 抄送 75% - 高炉 70% - B3 65% - A6 60% - 99 55% - 8℃ 50% - 80 45% - 73 40% - 66 35% - 59 30% - 4D 25% - 40 20% - 33 15% - 26 10% - 1A 5% - 0D 0% - 00

【讨论】:

【参考方案9】:

这对我有用。

在 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.Forms - 更改状态栏颜色的主要内容,如果未能解决你的问题,请参考以下文章

Xamarin Forms - IOS - 汉堡菜单标题颜色与状态栏不同

更改 Xamarin Forms Android 导航页面颜色(按钮和返回)

更改 DatePicker [Xamarin.Forms] 的颜色

如何使用 Xamarin.Forms.Maps(无 Xamarin.Forms.GoogleMaps)在地图中应用样式或更改颜色

更改 Xamarin.Forms 按钮单击的颜色

如何在 xamarin.forms 中获取状态栏高度?