一开始,Android 上的状态栏颜色是由MainActivity
您在启动屏幕的第一个屏幕截图中看到了这一点。这StatusBarBehavior
仅当托管的 MAUI 应用程序加载到 MainActivity 中后才会启动。
UPDATE
在.NET MAUI中,您可以替换Maui.SplashTheme
中设置的主题MainActivity
具有您自己的主题的课程,例如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
子文件夹。在此文件夹中,创建两个文件(或编辑现有文件):
注意:styles.xml 实际上可能已经存在,只是被隐藏了。如果是这样,请右键单击values
文件夹并选择添加 -> 现有项目然后选择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
item:
<?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后缀)。在此文件夹中,再次创建两个文件:
In your 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
item:
<?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 的深色主题时,这将设置您的启动屏幕颜色。
主题结论
Since Maui.SplashTheme
继承自Theme.MaterialComponents.DayNight
您可以操纵任何类型的属性来显示本机 Android 视图和窗口,例如状态栏和操作栏。这仅仅需要一个values
and a values-night
文件夹存在于Platforms/Android/Resources/
每个包含一个colors.xml
and a styles.xml
file.
你可以找到下面的定义Maui.SplashTheme
这里的主题:https://github.com/dotnet/maui/blob/main/src/Core/src/Platform/Android/Resources/values/styles.xml https://github.com/dotnet/maui/blob/main/src/Core/src/Platform/Android/Resources/values/styles.xml
有关 Android 主题的更多信息:
- https://developer.android.com/develop/ui/views/theming/darktheme https://developer.android.com/develop/ui/views/theming/darktheme
- https://www.digitalocean.com/community/tutorials/android-daynight-theme-night-mode https://www.digitalocean.com/community/tutorials/android-daynight-theme-night-mode
在运行时操作 StatusBarColor
加载 MainActivity 并托管您的 MAUI 应用程序后,您仍然可以通过调用来操作 StatusBarColorWindow.SetStatusBarColor()
任何时候,例如像这样(请注意,您可以在任何其他地方执行此操作,并使用控制反转在共享上下文中设置颜色):
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);
}
}
}
这就是我在当前项目之一中使用它的方式。我想知道如何在启动屏幕期间更改状态栏,并发现您需要更改Maui.SplashTheme
为了那个原因。
响应主题更改
如果需要在运行时根据系统主题更改主题并响应更改,请参见以下内容:
https://learn.microsoft.com/en-us/dotnet/maui/user-interface/system-theme-changes#react-to-theme-changes https://learn.microsoft.com/en-us/dotnet/maui/user-interface/system-theme-changes#react-to-theme-changes
Note:如果您想在运行时从共享代码中显式设置状态栏颜色,则需要为此使用控制反转或条件编译。您可以为此使用任何 IoC 容器或关注 James Montemagno 的 YT 视频:https://youtu.be/JCgxK0pWjNg https://youtu.be/JCgxK0pWjNg
如果您有兴趣让用户选择主题,请查看我关于使用 .NET MAUI 的深色和浅色主题的博客文章:
https://ewerspej.hashnode.dev/implement-dark-mode-in-net-maui https://ewerspej.hashnode.dev/implement-dark-mode-in-net-maui