shuhelohelo’s blog

Xamarin.Forms多めです.

Xamarin.Forms: Androidのステータスバーの色を変更する

ステータスバーの色はナビゲーションバーの色や,アプリを代表する色に揃えると見栄えがよくなる.

montemagno.com

こちらの記事のとおりにすればAndroidのステータスバーの色と文字の色を変更することができる.

ただ,記事の中ではActivityの取得にPlugin.CurrentActivity.CrossCurrentActivity.Current.Activityを使用しているが,今であればXamarin.Essentials.Platforms.CurrentActivityで取得できる.ただしXamarin.Essentialsのバージョンが1.3.1ぐらいだとこのプロパティは存在しないので,それ以上を使うこと.少なくとも1.5.3.2では存在する.

これはAndroidの機能なのでインターフェース経由で共有プロジェクト側から呼び出せるようにする.

今回はXamarin.Forms.Dependency属性を使うことにするが,例えば,PrismなどのMVVMフレームワーク,またはDIコンテナを使っている場合は,DIコンテナに登録して共有プロジェクト側から呼び出すようにしたら良い.基本的には変わらない.

まずは共有プロジェクト側にインターフェースを作成する.

    public interface IStatusBarColorManager
    {
        void SetColor(System.Drawing.Color color, bool darkStatusBarTint);
    }

次にこれを実装したクラスをAndroidプロジェクト側に作成する.

[assembly: Xamarin.Forms.Dependency(typeof(StatusBarColorManager))]
namespace XFChangeAndroidStatusBarColor.Droid.Services
{
    public class StatusBarColorManager : IStatusBarColorManager
    {
        /// <summary>
        /// darkStatusBarTintがtrueのときは黒,そうでない場合は白.
        /// 背景色に応じて指定すること.
        /// Lollipop以上で有効
        /// </summary>
        /// <param name="color"></param>
        /// <param name="darkStatusBarTint">trueのときは文字が黒,そうでない場合は白.</param>
        public void SetColor(System.Drawing.Color color, bool darkStatusBarTint)
        {
            if (Build.VERSION.SdkInt < Android.OS.BuildVersionCodes.Lollipop)
            {
                return;
            }

            var activity = Xamarin.Essentials.Platform.CurrentActivity;
            var window = activity.Window;

            window.AddFlags(Android.Views.WindowManagerFlags.DrawsSystemBarBackgrounds);
            window.ClearFlags(Android.Views.WindowManagerFlags.TranslucentStatus);

            //背景色変更
            window.SetStatusBarColor(color.ToPlatformColor());

            //文字色変更
            if (Build.VERSION.SdkInt >= Android.OS.BuildVersionCodes.M)
            {
                var flag = (Android.Views.StatusBarVisibility)Android.Views.SystemUiFlags.LightStatusBar;
                window.DecorView.SystemUiVisibility = darkStatusBarTint ? flag : 0;
            }
        }
    }
}

このとき,namespaceの上に[assembly: Xamarin.Forms.Dependency(typeof(StatusBarColorManager))]をつけて,このクラスをサービスロケータに登録する.

あとは共有プロジェクト側で例えば以下のように呼び出して使う.

    public partial class MainPage : ContentPage
    {
        public MainPage()
        {
            InitializeComponent();

            var scm = Xamarin.Forms.DependencyService.Get<IStatusBarColorManager>();

            scm.SetColor(Color.Red, false);//これ
        }
    }

これを実行すると,以下のようにステータスバーの色が指定した色になる.

f:id:shuhelohelo:20200626170410p:plain

ソースコード

github.com