在浅色和深色主题的初始屏幕上无法更改状态栏

2024-05-01

我试图根据设置为浅色或深色主题的设备来更改 StatusBar 的颜色/样式,但运气不佳。

应用程序加载后,以下 XAML 即可运行,但在启动屏幕上不起作用:

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

Look of StatusBar during splashscreen: enter image description here

Look of StatusBar once app has loaded: enter image description here

正如您所看到的,上面的 XAML 似乎不会在闪屏期间影响 StatusBar,因为它仍然显示默认的紫色和白色文本。知道如何在应用程序显示启动屏幕时更改状态栏吗?

最终目标是根据设置为浅色或深色主题的设备相应地设置状态栏颜色和图标颜色。例如,如果设备设置为使用深色主题,则显示启动画面和应用程序外壳时的状态栏应为带有浅色文本/图标的深色背景。当设备设置为使用浅色主题时,显示启动画面和应用程序外壳的状态栏应该是带有深色文本/图标的浅色背景。

我已经检查了许多与此相关的现有问题,但它们似乎都已过时,因为我正在使用 API 33。


一开始,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子文件夹。在此文件夹中,创建两个文件(或编辑现有文件):

  • 颜色.xml
  • 样式.xml

注意: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后缀)。在此文件夹中,再次创建两个文件:

  • 颜色.xml
  • 样式.xml

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在浅色和深色主题的初始屏幕上无法更改状态栏 的相关文章

  • onActivityResult 中的完成活动不起作用

    我有一对必须同生共死的活动 基本上 AlphaActivity 会做一些工作 然后发送一个意图 startActivityForResult 对于 Beta 活动 当 Beta 活动完成时 我希望它发送一个意图 startActivity
  • Espresso - 检查使用按钮按下意图打开哪个活动?

    是否可以跟踪按下某个按钮后打开了哪个 Activity 我有一个测试 其中当单击 按下按钮时 it 向服务器发送请求 直到发送请求时 它打开一个活动 验证是否执行成功在测试中 我需要检查打开的 Activity 是什么 我的测试示例 检查
  • 如何改变android中menuItem的背景颜色?

    我正在以编程方式将菜单项添加到菜单中 我想在选择特定项目时添加背景颜色 如何为 menuItem 添加背景 您的回答将不胜感激 虽然其他答案提供了更改样式 这会影响all菜单项 据我了解 需要更改一个菜单项 我建议你使用android ac
  • 查找回收器视图中的第一个可见项目是否是列表的第一项

    我有一个包含 13 个数据项的回收器视图 我想知道列表中的第一项是否可见 我知道像这样的方法findFirstVisibleItemPosition and findLastVisibleItemPosition但他们没有说明第一个可见项目
  • doInBackground 运行时是否可以停止 asynctask?

    我正在 ActivityB Oncreate 中创建异步任务 在该任务中 我正在运行无限 while 循环doInBackground 当我转到上一个活动并再次回到该活动时 创建了另一个异步任务 我的问题现在是两个无限 while 循环正在
  • android 谷歌+登录定制

    我正在创建一个 Android 应用程序 现在我正在实现社交网络登录 Facebook 按钮很好 但 google 按钮的语言与 Facebook 不同 另外 它只说 登录 我想让它说 用谷歌登录 我是 android 编程的新手 看到我需
  • 方法断点可能会大大减慢调试速度

    每当向方法声明行添加断点 在 Intellij IDEA 或 Android Studio 中 时 都会出现一个弹出窗口 方法断点可能会大大减慢调试速度 为什么会这样戏剧性地减慢调试速度 是我的问题吗 将断点放在函数的第一行有什么不同 Th
  • OpenCV InRange 参数

    我在 Android 上使用 OpenCV 来实时查找特定颜色的圆圈 我的第一步是仅保留与我正在寻找的定义颜色相对应的像素 在本例中为红色或绿色 示例图像 https i stack imgur com CIozU jpg 为此 我正在使用
  • 无法将 Tesseract OCR 模块添加到 Android Studio

    我按照此处找到的分步指南进行操作 https www codeproject com Articles 840623 Android Character Recognition https www codeproject com Artic
  • Android 手机应用意图

    我想在手机上启动手机应用程序作为意图 我正在使用这个代码 startActivity getPackageManager getLaunchIntentForPackage com android phone 但该函数抛出一个空指针异常 因
  • 服务器到 Firebase HTTP POST 结果为响应消息 200

    使用 Java 代码 向下滚动查看 我使用 FCM 向我的 Android 发送通知消息 当提供正确的服务器密钥令牌时 我收到如下所示的响应消息 之后从 FCM 收到以下响应消息 Response 200 Success Message m
  • Flutter / FireStore:如何在 Flutter 中显示 Firestore 中的图像?

    我想将我在应用程序中使用的一些图像放入 Firestore 并从那里显示它们 而不是将它们作为资产捆绑在我的应用程序中 为了做到这一点 我想出了以下解决方案 对于我想要显示图像的项目 我创建了一个 Firebase 文档 其中有一个字段存储
  • 在 Android 上的测试用例之外运行 ExtractDecodeEditEncodeMuxTest

    我正在尝试添加在 Android 上提取 解码 编辑 编码和混合视频的功能 因此 我发现了一些非常有用的实现 它是Android CTS的一部分ExtractDecodeEditEncodeMuxTest https android goo
  • Facebook LoginActivity 未正确显示

    我有一个使用 Facebook 登录的应用程序 我有 FacebookSDK 并且使用 com facebook LoginActivity 问题是 在 10 英寸平板电脑上 当显示软键盘时 活动无法正确显示 我使用的是 Samsung G
  • 版本 5 上带有 getBackground().setAlpha 的按钮 - 棒棒糖无法正常工作

    我有这段代码 适用于自 API 14 以来的每个版本 但在 Android 5 0 Lollipop 上无法正常工作 以下是我希望按钮出现的方式 单击按钮1 buttonArrivals getBackground setAlpha 180
  • 手动启用时 Firebase Crashlytics 不报告崩溃

    Crashlytics 在没有选择加入报告的情况下也能正常工作 但一旦我根据规定设置了选择加入报告 它就会停止报告任何内容tutorial https firebase google com docs crashlytics customi
  • 如何在android中录制音频时暂停背景音乐

    我正在 Android 中开发一个音频记录应用程序 因此 如果设备音乐播放器中已播放任何背景音乐 则应在开始录制之前暂停该背景音乐 并且每当录制停止或暂停时 背景音乐都应恢复 播放录制的音频时也应该如此 有人可以帮我解决这个问题吗 提前致谢
  • 如何使 tablayout 文本大小相等?

    这就是我所做的 我为文本创建了一种样式
  • ormlite 将日期读取为 'yyyy-MM-dd'

    我需要读取给我的 sqlite 数据库 因此我无法更改表中的日期格式 yyyy MM dd 当我尝试使用 ormlite 为我生成对象时 使用以下注释 DatabaseField columnName REVISION DATE dataT
  • 尝试使用带有有效购买令牌的 Java Google Play Developer API v3 检索应用内购买信息时出现错误请求(无效值)

    当使用 Java Google Play Developer API 版本 3 并请求有效购买令牌的购买信息时 我收到以下异常 API 调用返回 400 Bad Request 响应以及以下消息 code 400 errors domain

随机推荐