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

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(使用前将#替换为@)

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

  • Kapt 未在即时应用程序功能模块中生成类

    我在我的 Android 应用程序中使用 dagger2 即使没有错误 它也不会生成匕首组件类 我已经在设置中启用了注释处理器并重新启动了我的 android studio 但这对我来说不起作用 我也读过这个帖子Dagger2 不生成 Da
  • Google Play 商店中基于服务的 Android 应用程序

    我正在开发一个应用程序 该应用程序仅包含一些服务 没有任何活动 即没有 UI 基本上 当用户在他 她的设备上安装应用程序时 我希望有 2 到 3 个服务在后台运行 对此我有几个疑问 应用程序安装后我的服务将如何启动 我的BroadcastR
  • Android Facebook sdk 3.5 分享对话框

    您好 我正在为 android sdk 3 5 实现 facebook 共享对话框 但是我按照指南没有取得任何成功 FacebookDialog shareDialog new FacebookDialog ShareDialogBuild
  • Android ListView 自定义适配器 ImageButton

    这可能不是正确的方法 如果有更好的方法请告诉我 我创建了一个自定义适配器类 在我的 getView 方法中我膨胀了我想要使用的视图 public View getView int position View convertView View
  • Android 5.0 Lollipop 中屏幕固定关闭时如何收到通知?

    我有一个在后台运行的应用程序 并在手机上发生特定事件时启动活动 我发现在 Android 5 0 中 当用户使用另一个应用程序打开屏幕固定时 startActivity intent 调用将被完全忽略 我的应用程序不知道该活动尚未启动 因此
  • 游标索引越界异常

    打开后出现光标索引越界错误 数据库 请任何人告诉我如何打开现有数据库 sqllite Android 我想在数据库上触发一个选择查询 检索一些信息 public void getPatient SQLiteDatabase db Strin
  • 更改 Android 中的媒体音量?

    我可以更改媒体音量吗 如何 到目前为止我用过这个 setVolumeControlStream AudioManager STREAM MUSIC 但有一个搜索栏并且想要更改媒体音量 而不是铃声音量 那么有人可以告诉我如何更改媒体音量onC
  • 使用 mupdf android 库导航到特定页面

    我如何使用 muPDF 库导航到特定页面 或者有没有办法让图书馆不记得我最后在那个pdf文件中浏览的是哪一页 Uri uri Uri parse path Intent intent new Intent MainActivity getC
  • 如何更改对话框片段内的片段

    我想做一个空的DialogFragment with a LinearLayout然后更改里面的片段LinearLayout 例如 第一个片段是 3 个按钮 facebook google 电子邮件登录 的登录 当有人按下电子邮件时 第 2
  • 如何使用 Swipe 视图实现 Android TabLayout 设计支持库

    我将使用 android TabLayout 设计支持库 但我不知道如何使用滑动视图 这是我的代码 XML
  • 我应该选择的最低 SDK 版本是多少? (截至2018年11月)

    据我所知 android studio 中默认的最小 SDK 设置是 15 我读到我应该增加它 因为没有多少人 或者可能没有 仍在使用该 android 版本 另外 我计划使用 android studio 中的一些新功能 这些功能仅适用于
  • 使用 UPI url 调用 PSP 应用程序

    我正在尝试创建一个商家应用程序 它将根据 NPCI 的指南生成一个 url 此 url 将作为意图共享 并且 PSP 应用程序 任何注册的银行应用程序 应该能够侦听该 url 并被调用 我已经形成了这样的网址 upi pay pa icic
  • 有没有办法在多个嵌套的 RecyclerView 之间共享同一个 LayoutManager

    我正在开发一个显示游戏列表的应用程序 在每个游戏的 itemView 内 我还有一个要显示的视频列表 预览和结构如下 我部署了一个RecyclerView作为窗口根视图 然后对于视频 我使用网格样式的RecyclerView来显示 所以这里
  • 如何更改 Android 12 启动屏幕中的图标形状?

    我想要矩形形状的启动屏幕图标 而不是 android 12 中的圆形形状 我不相信你可以 如果你看这里的第 3 点 https developer android com about versions 12 features splash
  • BitmapFactory.decodeResource() 忽略 jpg 图像的 inPreferredConfig 选项

    我尝试将jpeg资源图像加载到ARGB 8888格式的位图 BitmapFactory Options opts new BitmapFactory Options opts inPreferredConfig Bitmap Config
  • 从Android客户端登录appengine

    我正在尝试登录应用程序引擎并访问应用程序引擎中的用户服务API 基本上我希望能够看到谁登录了我的 servlet 我正在使用从 android 获取 authtoken 然后从应用程序引擎获取 ASID 或 SACID cookie 的身份
  • 将 Crashlytics 集成到图书馆项目

    我有一个图书馆项目 自定义视图库项目 它没有任何活动 服务 我想将 Crashlytics SDK 集成到我的库中 当我尝试通过 Android Studio 的 Crashlytics 插件 工具栏中的图标 添加它时 它只是停留在 Che
  • 应用程序中空指针异常[重复]

    这个问题在这里已经有答案了 我正在尝试在我的应用程序中实施应用程序内计费 我写了这段代码 public class Settings extends PreferenceFragment ServiceConnection mService
  • 使用 RecyclerView.Adapter 在 onBindViewHolder() 内设置 onItemClickListener

    我有一个自定义对象 学生班 public class Student private String name private String age public String getName return name public void
  • 膨胀类 android.support.design.widget.CoordinatorLayoute 时出错

    我正在尝试运行我的应用程序 但不断收到标题中列出的错误 我读过周围的内容 人们说尝试将主题更改为 AppCombat 主题 但这似乎不起作用 以下是我遇到的错误 Process com example jmeyer27 crazytiles

随机推荐