0

xamarin フォーム アプリケーションがあり、ナビゲーション バーの色を変更できました。ステータスバーの色をクロスプラットフォームで変更するにはどうすればよいですか? 下の画像では、緑色のナビゲーションページバーの背景色を確認できます。その上は青なので、その色を変えたいです。xamarinフォームでこのクロスプラットフォームを実現するにはどうすればよいですか?

ここに画像の説明を入力

4

2 に答える 2

2

DependencyServiceを使用できます。

share project で、インターフェイスを定義します

public interface IStatusBarColor
{
    void SetColoredStatusBar(string color);

}

アンドロイドで

まず、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

ここに画像の説明を入力

于 2020-04-15T11:37:13.927 に答える