【问题标题】:Set DarkMode on the first page status bar xamarin forms android在第一页状态栏上设置暗模式 xamarin forms android
【发布时间】:2021-05-04 14:09:46
【问题描述】:

使用 xamarin 表单,我们正在添加在暗光模式之间切换的功能。一切都很好,但是无论我做什么,android 应用程序的第一页状态栏颜色都不会改变。

我猜在 android 项目中我必须在 OnCreate 之前调用 SetTheme(...)。

或者我在这里遗漏了什么?

问题 如何根据主题设置状态栏颜色?一旦加载了android,下面的代码就不会改变

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

建议? 谢谢

【问题讨论】:

  • 通常Android上的状态栏颜色是根据colorPrimaryDark设置的,也许可以尝试更改它,也可以在xamarin表单的NavigationPage BarBackgroundColor属性上设置状态栏颜色

标签: xamarin.forms xamarin.android


【解决方案1】:

试试这个:

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

或者

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

这两个功能都有效。

您可以在MainActivity.OnCreate 方法中更新状态栏颜色,也可以监听App.Current.RequestedThemeChanged 事件。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-04
    • 2017-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-21
    相关资源
    最近更新 更多