在Xamarin.Forms中的android上运行时更改状态栏颜色

时间:2018-03-27 21:29:10

标签: c# android xamarin xamarin.forms xamarin.android

我想以编程方式在运行时更改状态栏的颜色。我试过这个:

if (Build.VERSION.SdkInt >= BuildVersionCodes.Lollipop)
{
    Window.ClearFlags(WindowManagerFlags.TranslucentStatus);
    Window.AddFlags(WindowManagerFlags.DrawsSystemBarBackgrounds);
    Window.SetStatusBarColor(Android.Graphics.Color.Blue);
}

但它只适用于MainActivity.cs类。

我想在运行时更改它。

1 个答案:

答案 0 :(得分:0)

依赖接口:

public interface IStatusBarColor
{
    void CoreMeltDown();
    void MakeMe(string color);
}

您需要当前活动的上下文,您可以通过多种方法获取该上下文; MainActivity上的静态变量,使用CurrentActivityPlugin等...让我们保持简单& hackie并使用静态var,因此添加一个静态Context var并将其设置在OnResume

MainActivity Context

    public static Context context;
    protected override void OnResume()
    {
        context = this;
        base.OnResume();
    }

Android依赖项实施:

public class StatusBarColor : IStatusBarColor
{
    public void MakeMe(string color)
    {
        if (Build.VERSION.SdkInt >= BuildVersionCodes.Lollipop)
        {
            var c = MainActivity.context as FormsAppCompatActivity;
            c?.RunOnUiThread(() => c.Window.SetStatusBarColor(Color.ParseColor(color)));
        }
    }

    public void CoreMeltDown()
    {
        Task.Run(async () =>
        {
            for (int i = 0; i < 10; i++)
            {
                switch (i%2)
                {
                    case 0:
                        MakeMe($"#{Integer.ToHexString(Color.Red.ToArgb())}");
                        break;
                    case 1:
                        MakeMe($"#{Integer.ToHexString(Color.White.ToArgb())}");
                        break;
                }
                await Task.Delay(200);
            }
        });
    }

}

用法:

var statusBarColor = DependencyService.Get<IStatusBarColor>();

statusBarColor?.MakeMe(Color.Blue.ToHex());

statusBarColor?.CoreMeltDown();