Xamarin表单-更改状态栏颜色跨平台

问题描述 投票:0回答:2

我有一个xamarin表单应用程序,并且已经能够更改导航栏颜色。如何更改状态栏颜色跨平台?在下图中,您可以看到绿色的导航页面栏背景色。上面是蓝色,我想更改它的颜色。如何以xamarin形式实现此跨平台?

enter image description here

xamarin.forms background-color android-statusbar ios-statusbar
2个回答
0
投票

您可以使用DependencyService

在共享项目中,定义界面

public interface IStatusBarColor
{
    void SetColoredStatusBar(string color);

}

在Android中

首先,从nuegt安装插件CurrentActivity,检查https://github.com/jamesmontemagno/CurrentActivityPlugin


using Android.OS;
using Android.Views;
using App24.Droid;
using App24;
using Xamarin.Forms;
using Plugin.CurrentActivity;

[assembly: Dependency(typeof(SetStatusBarColorImplemention))]
namespace App24.Droid
{
    public class SetStatusBarColorImplemention : IStatusBarColor
    {
        public SetStatusBarColorImplemention()
        {
        }

        public void SetColoredStatusBar(string color)
        {
            if (Build.VERSION.SdkInt >= BuildVersionCodes.M)
            {
                Device.BeginInvokeOnMainThread(() =>
                {
                    var currentWindow = GetCurrentWindow();
                    currentWindow.DecorView.SystemUiVisibility = 0;
                    currentWindow.SetStatusBarColor(Android.Graphics.Color.ParseColor(color));
                });
            }
        }

        Window GetCurrentWindow()
        {
            var window = CrossCurrentActivity.Current.Activity.Window;

            window.ClearFlags(WindowManagerFlags.TranslucentStatus);

            window.AddFlags(WindowManagerFlags.DrawsSystemBarBackgrounds);

            return window;
        }
    }
}

在iOS中


using App24;
using App24.iOS;
using Foundation;
using UIKit;
using Xamarin.Forms;
using Xamarin.Forms.Platform.iOS;
using ObjCRuntime;
using CoreGraphics;
[assembly: Dependency(typeof(SetStatusBarColorImplemention))]
namespace App24.iOS
{
    public class SetStatusBarColorImplemention : IStatusBarColor
    {
        public void SetColoredStatusBar(string hexColor)
        {


            if(UIDevice.CurrentDevice.CheckSystemVersion(13, 0))
            {
                UIWindow window = UIApplication.SharedApplication.KeyWindow;
                UIView view = new UIView(window.WindowScene.StatusBarManager.StatusBarFrame);
                window.AddSubview(view);
                Device.BeginInvokeOnMainThread(() =>
                {

                    if (view.RespondsToSelector(new Selector("setBackgroundColor:")))
                    {
                        view.BackgroundColor = Color.FromHex(hexColor).ToUIColor();
                    }

                    UIApplication.SharedApplication.SetStatusBarStyle(UIStatusBarStyle.LightContent, false);
                    topViewControllerWithRootViewController(UIApplication.SharedApplication.KeyWindow.RootViewController).SetNeedsStatusBarAppearanceUpdate();
                });

            }


            else
            {
                Device.BeginInvokeOnMainThread(() =>
                {
                    UIView statusBar = UIApplication.SharedApplication.ValueForKey(new NSString("statusBar")) as UIView;
                    if (statusBar.RespondsToSelector(new Selector("setBackgroundColor:")))
                    {
                        statusBar.BackgroundColor = Color.FromHex(hexColor).ToUIColor();
                    }
                    UIApplication.SharedApplication.SetStatusBarStyle(UIStatusBarStyle.LightContent, false);
                    topViewControllerWithRootViewController(UIApplication.SharedApplication.KeyWindow.RootViewController).SetNeedsStatusBarAppearanceUpdate();
                });
            }


        }

        UIViewController topViewControllerWithRootViewController(UIViewController rootViewController)
        {
            if (rootViewController is UITabBarController)
            {
                UITabBarController tabBarController = (UITabBarController)rootViewController;
                return topViewControllerWithRootViewController(tabBarController.SelectedViewController);
            }
            else if (rootViewController is UINavigationController)
            {
                UINavigationController navigationController = (UINavigationController)rootViewController;
                return topViewControllerWithRootViewController(navigationController.VisibleViewController);
            }
            else if (rootViewController.PresentedViewController != null)
            {
                UIViewController presentedViewController = rootViewController.PresentedViewController;
                return topViewControllerWithRootViewController(presentedViewController);
            }
            else
            {
                return rootViewController;
            }
        }

    }
}

现在根据需要调用该行。

DependencyService.Get<IStatusBarColor>().SetColoredStatusBar("#00ff00");  // set the color of bar as green

enter image description here


-1
投票

据我所知,您需要分别在每个平台上设置状态栏颜色。在StackOverflow和Google上有很多类似的问题可以帮助您解决问题。

对于Android:在参考资料->值中检查您的styles.xml寻找类似<item name="android:statusBarColor">#000000</item>的颜色

对于iOS:在AppDelegate.cs中查找FinishedLaunsching-方法。您可以通过UIApplication.SharedApplication.SetStatusBarStyle(UIStatusBarStyle.DarkContent, false);

更改样式
© www.soinside.com 2019 - 2024. All rights reserved.