5

根据文档,我只需要android:forceDarkAllowed=true在我的活动清单中设置并继承主题parent="Theme.MaterialComponents.DayNight"。我试过了,但是没有用。

这是我的清单文件:

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity
        android:name=".MainActivity"
        android:forceDarkAllowed="true">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

这是我的styles.xml风格:

<style name="AppTheme" parent="Theme.MaterialComponents.Light">
    ...
</style>

<style name="AppTheme.Dark" parent="Theme.MaterialComponents.DayNight">
    ...
</style>

我尝试使用以下代码获取活动的主题名称:

resources.getResourceName(
    packageManager.getPackageInfo(packageName, PackageManager.GET_META_DATA)
        .applicationInfo.theme
)

它显示我com.example.name:style/AppTheme而不是AppTheme.Dark。我怎样才能让它在我运行应用程序时MainActivity自动设置为使用AppTheme.Dark(即暗模式) using android:forceDarkAllowed

4

3 回答 3

9

这不是暗模式在 Android 10 上的工作方式。

.Dark首先,无论用户是否启用暗模式,Android 都不会在任何时候神奇地附加到您的主题。你有android:theme="@style/AppTheme". 所以,Android 会AppTheme一直使用,而你AppTheme.Dark不会被使用。

其次,背后的想法DayNight是您始终将其用作基础主题,Android 将根据用户请求在正常模式和暗模式之间切换。因此,如果您切换AppTheme到 extendDayNight并摆脱AppTheme.Dark,您将匹配文档要求的内容。

android:forceDarkAllowed适用于您无法使用DayNight主题并且希望 Android 尝试自动将您的 UI 转换为深色主题的情况。如果您想继续AppTheme扩展Light而不是DayNight,这可能会起作用(我个人没有尝试过使用MaterialComponents主题)。但是,即便如此,它也只会在用户启用暗模式时(例如,点击通知阴影图块)。

例如,在这个示例应用程序中,我使用DayNight了我的主题:

<resources>

  <!-- Base application theme. -->
  <style name="AppTheme" parent="Theme.AppCompat.DayNight">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
  </style>

</resources>

res/values/我对和中的这些颜色有不同的定义res/values-night/。我不使用forceDarkAllowed. 而且,当用户切换夜间模式时,我的 UI 来自:

白天晚上正常

到:

昼夜黑暗模式

我怎样才能使它在我运行应用程序时,MainActivity 使用 android:forceDarkAllowed 自动将自己设置为使用 AppTheme.Dark(即暗模式)?

你没有。

如果您一直想要一个深色主题,请使用常规主题(not Light, not DayNight)。

于 2020-02-02T14:18:44.670 回答
5
  1. 如果您的应用使用深色主题(例如 Theme.Material),则不会应用 Force Dark。同样,如果您的应用程序的主题继承自 DayNight 主题,则不会应用 Force Dark,因为会自动切换主题。
  2. 深色主题在 Android 10(API 级别 29)及更高版本中可用。确保您设备的 API 级别为 29 + 并且您的目标 SDKgradle为 29。
  3. 有两种方法可以应用深色主题:
    1. DayNight - 可自定义的主题 - 您可以控制深色/浅色主题的外观
    2. 强制黑暗 - 您控制浅色主题,如果用户选择深色模式,系统将在运行时将您的视图转换为深色主题。
于 2020-02-02T14:17:52.737 回答
0

无论当前系统设置如何,都有一些设置允许动态设置白天或夜晚。

每个选项都直接映射到 AppCompat.DayNight 模式之一:

Light - MODE_NIGHT_NO
Dark - MODE_NIGHT_YES
System default - MODE_NIGHT_FOLLOW_SYSTEM

要切换主题,请调用 AppCompatDelegate.setDefaultNightMode()。

https://developer.android.com/guide/topics/ui/look-and-feel/darktheme#change-themes

这适用于设置 DayNight 主题。如果您尝试利用 Android 10 中的 Force Dark,它适用于.Light子主题。它不会应用于任何DayNight或固有的黑暗主题。

应用程序必须通过在活动主题中设置 android:forceDarkAllowed="true" 来选择强制黑暗。该属性在所有系统和 AndroidX 提供的轻量级主题上设置,例如 Theme.Material.Light。

https://developer.android.com/guide/topics/ui/look-and-feel/darktheme#force-dark

在此之下,文档还指定了如何在资源或代码中排除某些项目。

可以使用 android:forceDarkAllowed 布局属性或 setForceDarkAllowed() 在特定视图上控制 Force Dark。

除此之外,还有一些方法可以检测当前系统的亮/暗设置并使用上述选项对其进行响应,但这是另一篇文章。

对于黑暗主题来说,这不是一个很好的解决方案,对于与已接受答案的任何重叠,我深表歉意,但我不同意声称某些事情是不可能的,因为它不是首选。

于 2022-02-19T15:06:01.413 回答