XAML 无法在亮主题和暗主题的闪屏上更改StatusBar

js5cn81o  于 2022-12-07  发布在  其他
关注(0)|答案(1)|浏览(149)

我正试图改变颜色/风格的StatusBar的基础上,设备被设置为光明或黑暗的主题,但没有太多的运气。
以下XAML在应用程序加载后有效,但在启动屏幕上无效:

<ContentPage.Behaviors>
    <toolkit:StatusBarBehavior StatusBarColor="#F8F9FB" StatusBarStyle="DarkContent"  />
</ContentPage.Behaviors>

启动画面期间状态列的外观:

应用程序加载后状态栏的外观:

正如你所看到的,上面的XAML在闪屏期间似乎并没有影响状态栏,因为它仍然显示默认的紫色和白色文本。你知道如何在应用显示闪屏时更改状态栏吗?
最终目标是根据设置为浅色或深色主题的设备相应地设置状态栏颜色和图标颜色。例如,如果设备设置为使用深色主题,则显示闪屏和应用程序 shell 时的状态栏应为深色背景,并带有浅色文本/图标。当设备设置为使用浅色主题时,显示闪屏和应用程序 shell 时的状态栏应为浅色背景和深色文本/图标。
我已经检查了许多关于这一点的现有问题,但它们似乎都过时了,因为我使用的是API 33。

fslejnso

fslejnso1#

一开始,Android上的状态栏颜色是由您在第一个启动屏幕截图中看到的MainActivity设置的。StatusBarBehavior只有在MainActivity中加载托管的MAUI应用后才会生效。

更新

在.NET MAUI中,您可以将MainActivity类中设置的Maui.SplashTheme主题替换为您自己的主题,例如MyAppTheme

[Activity(Theme = "@style/MyAppTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation | ConfigChanges.UiMode | ConfigChanges.ScreenLayout | ConfigChanges.SmallestScreenSize | ConfigChanges.Density)]
public class MainActivity : MauiAppCompatActivity
{
    //...
}

您可以创建自己的主题,以设置启动画面的颜色,包括状态栏,您将需要创建一个黑暗和一个光明模式分别。

灯光模式

在MAUI项目中,导航到Platforms/Android/Resources/文件夹,如果还没有,则添加values子文件夹。在此文件夹中,创建两个文件(或编辑现有文件):

  • colors.xml
  • styles.xml

注意:styles.xml文件可能已经存在,只是被隐藏了。如果是这样,右键点击values文件夹,选择 Add -〉Existing Item,然后选择styles.xml文件。
然后,在您的colors.xml中定义一些颜色,例如:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="colorPrimary">#FF00FF</color>
    <color name="colorPrimaryDark">#019FF5</color>
    <color name="colorAccent">#019FF5</color>
</resources>

接下来,在styles.xml中创建您自己的主题,从Maui.SplashTheme继承并为android:windowSplashScreenBackground项设置颜色:

<?xml version="1.0" encoding="utf-8" ?>
<resources>
  <style name="MyAppTheme" parent="Maui.SplashTheme">
    <item name="android:windowSplashScreenBackground">@color/colorPrimary</item>
    <item name="android:windowLightStatusBar">true</item>
  </style>
</resources>

这将设置当用户使用Android的Light主题时的闪屏颜色。

暗模式

对于黑暗的主题,你需要做基本上相同的光主题,有一个小的区别。
在MAUI项目中,添加以下子文件夹:Platforms/Android/Resources/values-night(注意 -night 后缀)。在此文件夹中,再次创建两个文件:

  • colors.xml
  • styles.xml

colors.xml中定义一些颜色,例如:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="colorPrimary">#00FF00</color>
    <color name="colorPrimaryDark">#019FF5</color>
    <color name="colorAccent">#019FF5</color>
</resources>

同样,在styles.xml中创建您自己的主题,从Maui.SplashTheme继承并为android:windowSplashScreenBackground项设置颜色:

<?xml version="1.0" encoding="utf-8" ?>
<resources>
  <style name="MyAppTheme" parent="Maui.SplashTheme">
    <item name="android:windowSplashScreenBackground">@color/colorPrimary</item>
    <item name="android:windowLightStatusBar">false</item>
  </style>
</resources>

这将设置当用户使用Android的黑暗主题时的启动画面颜色。

主题结论

由于Maui.SplashTheme继承自Theme.MaterialComponents.DayNight,您可以操作任何类型的属性来显示原生Android视图和窗口,例如状态栏和操作栏。这只需要Platforms/Android/Resources/下存在valuesvalues-night文件夹,每个文件夹包含colors.xmlstyles.xml文件。
您可以在此处找到Maui.SplashTheme主题的定义:https://github.com/dotnet/maui/blob/main/src/Core/src/Platform/Android/Resources/values/styles.xml
有关Android主题的更多信息:

在加载MainActivity并托管MAUI应用程序之后,您仍然可以随时通过调用Window.SetStatusBarColor()来操作StatusBarColor,例如如下所示(注意,您可以在任何其他位置执行此操作,并使用控制反转从共享上下文中设置颜色):

protected override void OnCreate(Bundle savedInstanceState) 
{ 
    base.OnCreate(savedInstanceState);

    //make sure only supported APIs use it
    if (Build.VERSION.SdkInt >= BuildVersionCodes.R)
    {
        if(AppInfo.RequestedTheme == AppTheme.Light)
        {
            Window.InsetsController?.SetSystemBarsAppearance((int)WindowInsetsControllerAppearance.LightStatusBars, (int)WindowInsetsControllerAppearance.LightStatusBars);
            //set color
            Window.SetStatusBarColor(Color.White);
        }
        else
        {
            Window.InsetsController?.SetSystemBarsAppearance(0, (int)WindowInsetsControllerAppearance.LightStatusBars);

            Window.SetStatusBarColor(Color.Black);
        }
    }
}

这就是我在我目前的一个项目中使用它的方式。我想知道如何在Splash屏幕期间改变状态栏,然后发现你需要为此改变Maui.SplashTheme

响应主题更改

如果需要在运行时根据系统主题更改主题并对更改作出响应,请参阅以下内容:
https://learn.microsoft.com/en-us/dotnet/maui/user-interface/system-theme-changes#react-to-theme-changes

注意:如果您想在运行时从共享代码中显式设置状态栏颜色,您需要使用控制反转或条件编译。您可以使用任何IoC容器来实现此功能,或者观看James Montemagno的YT视频:https://youtu.be/JCgxK0pWjNg

如果您有兴趣让用户自己选择主题,请查看我的博客文章,其中介绍了使用.NET MAUI的Dark和Light主题:
https://ewerspej.hashnode.dev/implement-dark-mode-in-net-maui

相关问题