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
我搜索了但找不到是否可以从我的可移植代码更改每个平台的 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