如何在Android Studio上强制应用黑暗主题?

如何在Android Studio上强制应用黑暗主题?,android,android-studio,android-theme,android-dark-theme,Android,Android Studio,Android Theme,Android Dark Theme,根据,我只需要在我的活动清单中设置android:forceDarkAllowed=true,并从parent=“theme.MaterialComponents.DayNight”继承主题。我试过了,但没用 这是我的清单文件: <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@stri

根据,我只需要在我的活动清单中设置
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>
我尝试使用以下代码获取活动的主题名称:

resources.getResourceName(
    packageManager.getPackageInfo(packageName, PackageManager.GET_META_DATA)
        .applicationInfo.theme
)
它显示的是
com.example.name:style/AppTheme
而不是
AppTheme.Dark
。我如何使其在运行应用程序时,
main活动
使用
android:forceDarkAllowed
自动设置为使用
AppTheme.Dark
(即暗模式)

  • 如果你的应用程序使用深色主题(如theme.Material),则不会应用强制深色。类似地,如果应用程序的主题继承自DayNight主题,则由于自动主题切换,将不会应用Force Dark
  • Android 10(API级别29)及更高版本中提供了黑暗主题。确保设备的API级别为29+并且
    gradle
    中的目标SDK为29
  • 有两种方法可以应用黑暗主题:
  • DayNight-可定制主题-您可以控制黑暗/光明主题的外观
  • 强制暗-您控制亮主题,如果用户选择暗模式,系统将在运行时将您的视图转换为暗主题
  • 这不是安卓10的工作原理

    首先,Android不会在任何时候神奇地将
    .Dark
    附加到主题中,无论用户是否启用了黑暗模式。您有
    android:theme=“@style/AppTheme”
    。因此,Android将一直使用
    AppTheme
    ,而您的
    AppTheme.Dark
    将不会被使用

    其次,
    DayNight
    背后的想法是,你一直使用它作为基本主题,Android将根据用户请求在正常和黑暗模式之间切换。因此,如果您切换
    AppTheme
    以扩展
    DayNight
    ,并摆脱
    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>
    
    
    @颜色/原色
    @颜色/原色暗
    @颜色/颜色重音
    
    我在和中对这些颜色有不同的定义。我不使用
    forceDarkAllowed
    。而且,当用户切换夜间模式时,我的UI将从:

    致:

    我如何使其在运行应用程序时,MainActivity使用android:forceDarkAllowed自动设置为使用AppTheme.Dark(即黑暗模式)

    你没有


    如果您一直想要一个黑色主题,请使用常规主题(而不是
    浅色
    ,而不是
    日间
    )。

    谢谢!我喜欢你非常透彻的解释。我知道我可以通过编程和用户请求更改为暗主题。然而,我对android:forceDarkAllowed的
    部分感到非常困惑。我会试着重读一遍,看看是否遗漏了什么。谢谢你,真的。这太完美了。@Richard:
    android:forceDarkAllowed
    主要用于那些想要尝试在黑暗模式下破解支持而不修改主题和用户界面的现有应用程序。它工作得出奇地好,但仍然会出错。你需要彻底测试你的应用程序,以确认自动转换不会使某些东西难看或无法使用。啊,我明白了。我测试了android:forceDarkAllowed
    的样式
    主题.AppCompat
    主题.MaterialComponents
    ,它按照您所说的那样工作。它神奇地将颜色转换为黑色主题模式。然后我在
    Theme.AppCompat.DayNight/Light
    Theme.MaterialComponents.Light/DayNight
    上再次尝试了它,但没有成功。我首先阅读了这一行
    ,安卓在任何时候都不会神奇地将.Dark附加到你的主题中
    ,并立即得出结论,这个答案来自Commonware。
    <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>