Search code examples
xamarin.formsbackground-colorandroid-statusbarios-statusbar

Xamarin Forms - Change Statusbar Color crossplatform


I have a xamarin forms application and I have been able to change the navigationbar color. How can I change the statusbar color crossplatform? In the image below you can see the green navigationpagebar background color. Above that it's blue, I want to change the color of that. How can I achieve this crossplatform in xamarin forms?

enter image description here


Solution

  • You could use DependencyService .

    in share project , define the interface

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

    in Android

    Firstly , install the plugin CurrentActivity from nuegt , check 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;
            }
        }
    }
    

    in 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;
                }
            }
    
        }
    }
    

    Now invoked the line as you want .

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

    enter image description here