developer9969
developer9969

Reputation: 5236

Set DarkMode on the first page status bar xamarin forms android

Using xamarin forms and we are adding ability to switch between Dark-Light mode. All is good however the first page of the app in android whatever I do the status bar color wont change.

I guess that in the android project I have to call SetTheme(...) before OnCreate.

Or Am I missing something here?

Question How do you set the status bar color depending on theme? code below does not change once the android has loaded

        public void SetStatusBarColor(System.Drawing.Color color, bool darkStatusBarTint)
    {
        var activity = Platform.CurrentActivity;
        var window = activity.Window;
        window?.AddFlags(WindowManagerFlags.DrawsSystemBarBackgrounds);
        window?.ClearFlags(WindowManagerFlags.TranslucentStatus);
        window?.SetStatusBarColor(color.ToPlatformColor());

        var flag = (StatusBarVisibility)SystemUiFlags.LightStatusBar;
        if (window != null)
        {
            window.DecorView.SystemUiVisibility = darkStatusBarTint ? flag : 0;
        }
    }

Suggestions? thanks

Upvotes: 1

Views: 297

Answers (1)

Mateus Henrique
Mateus Henrique

Reputation: 198

Try this:

private void SetStatusBarColor(System.Drawing.Color color, bool darkStatusBarTint)
{
    var activity = Platform.CurrentActivity;
    var window = activity.Window;

    if (window != null)
    {
        window.AddFlags(WindowManagerFlags.DrawsSystemBarBackgrounds);
        window.ClearFlags(WindowManagerFlags.TranslucentStatus);
        window.SetStatusBarColor(color.ToPlatformColor());
        
        StatusBarVisibility flags = default;

        if (darkStatusBarTint)
            flags |= (StatusBarVisibility)SystemUiFlags.LightStatusBar;
        else
            flags &= ~(StatusBarVisibility)SystemUiFlags.LightStatusBar;

        window.DecorView.SystemUiVisibility = flags;
    }
}

Or

private void SetStatusBarColor(System.Drawing.Color color, bool darkStatusBarTint)
{
    var activity = Platform.CurrentActivity;
    var window = activity.Window;

    if (window != null)
    {
        window.AddFlags(WindowManagerFlags.DrawsSystemBarBackgrounds);
        window.ClearFlags(WindowManagerFlags.TranslucentStatus);
        window.SetStatusBarColor(color.ToPlatformColor());

        window.DecorView.SystemUiVisibility = darkStatusBarTint
            ? (StatusBarVisibility)SystemUiFlags.LightStatusBar
            : StatusBarVisibility.Visible;
    }
}

Both functions work.

You can update the StatusBar color in the MainActivity.OnCreate method and also listen to the App.Current.RequestedThemeChanged event.

public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
{
    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);

        Xamarin.Essentials.Platform.Init(this, savedInstanceState);
        global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
        LoadApplication(new App());
        
        ApplyStatusBarColor(App.Current.RequestedTheme);
        App.Current.RequestedThemeChanged += (s, e) => ApplyStatusBarColor(e.RequestedTheme);
    }

    private void ApplyStatusBarColor(Xamarin.Forms.OSAppTheme osAppTheme)
    {
        if (osAppTheme == Xamarin.Forms.OSAppTheme.Dark)
            SetStatusBarColor(Xamarin.Forms.Color.Blue, false);
        else
            SetStatusBarColor(Xamarin.Forms.Color.Yellow, true);
    }
}

Upvotes: 1

Related Questions