【问题标题】:How to disable night mode in my application even if night mode is enable in android 9.0 (pie)?即使在android 9.0(pie)中启用了夜间模式,如何在我的应用程序中禁用夜间模式?
【发布时间】:2019-12-02 03:41:00
【问题描述】:

我在 android pie 发布之前创建了我的应用程序,在每个布局中我放置了 android: background = "white" 它在每个设备上都可以正常工作,但是当我的兄弟安装应用程序并启用 night mode 时,我的应用程序变成了一场灾难动起来,一切都变成了黑白电影。

<style name="AppTheme" parent="Theme.AppCompat.DayNight.DarkActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/COLOR_PRIMARY</item>
    <item name="colorPrimaryDark">@color/COLOR_PRIMARY</item>
    <item name="colorAccent">@color/COLOR_PRIMARY</item>
    <item name="cardViewStyle">@style/CardView</item>
    <item name="android:fontFamily">@font/helvetica</item>
</style>

我的原色是红色。

【问题讨论】:

  • 您必须调整您的应用程序以适应夜间模式。 Android-Q 很快就会出现,所有应用都会受到系统设置的影响。您可以寻找黑暗主题教程..
  • Android 9 (Pie) 有这样的功能吗?你是说 Android Q 吗?
  • @Leo 不,这是安卓派
  • 就是这样。 Android Pie 没有“黑暗主题”。它是在 Android Q 中引入的
  • 有没有人找到 expo 托管应用的解决方法? (直到这个问题得到解决github.com/expo/react-native-appearance/issues/60

标签: android


【解决方案1】:

永远不要添加此代码:

AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);

如果你把它放在你的MainActivity的oncreate方法中,onCreate方法会被调用两次!!!我花了一个小时才发现添加此行导致了问题!

只需在你的 style.xml 中添加这一行:

<item name="android:forceDarkAllowed" tools:targetApi="q">false</item>

在我的代码中看起来像这样:

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.DayNight.DarkActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="android:forceDarkAllowed" tools:targetApi="q">false</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
</style>

【讨论】:

    【解决方案2】:

    只需在您的项目 (themes.xml) 中修改以下几处更改:

    如果您的 Android 工作室有最新版本,则将其应用于“themes.xml”和“themes.xml(night)”。

    变化:

    <style name="Theme.demo" parent="Theme.MaterialComponents.DayNight.NoActionBar">`  
    

    收件人:

    <style name="Theme.demo" parent="Theme.MaterialComponents.Light.NoActionBar">
    

    然后只需添加以下行:

    <item name="android:forceDarkAllowed" tools:targetApi="q">false</item>
    

    【讨论】:

      【解决方案3】:

      去添加:

       <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
      

      在您的主题中,即使您的设备启用了深色模式。在您的应用程序中应用浅色主题。

      【讨论】:

        【解决方案4】:

        对我来说,我还必须在 Theme.App.SplashScreen 样式中添加 &lt;item name="android:forceDarkAllowed"&gt;false&lt;/item&gt;,我正在使用 expo bare。

        <resources xmlns:tools="http://schemas.android.com/tools">
          <!-- Base application theme. -->
          <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
            <!-- Customize your theme here. -->
            <item name="android:textColor">#000000</item>
            <item name="android:forceDarkAllowed">false</item>
          </style>
          <style name="Theme.App.SplashScreen" parent="Theme.AppCompat.Light.NoActionBar">
            <!-- Below line is handled by '@expo/configure-splash-screen' command and it's discouraged to modify it manually -->
            <item name="android:windowBackground">@drawable/splashscreen</item>
            <item name="android:forceDarkAllowed">false</item>
            <!-- Customize your splash screen theme here -->
          </style>
        </resources>
        
        

        【讨论】:

          【解决方案5】:

          这对我有用,我改变了 来自&lt;style name="AppTheme" parent="Theme.AppCompat.DayNight.NoActionBar"&gt;&lt;style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"&gt;

          文件路径:android/app/src/main/res/values/styles.xml

          所有代码:

          <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
                  <!-- Customize your theme here. -->
                  <item name="android:textColor">#000000</item>
          </style>
          

          【讨论】:

            【解决方案6】:

            只需添加

            AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);

            之后

            super.onCreate(savedInstanceState);

            在每个活动中

            接下来在您的主题中添加

            &lt;item name="android:forceDarkAllowed" tools:targetApi="q"&gt;false&lt;/item&gt;

            【讨论】:

            • 我试过这个,但是没有任何效果。
            【解决方案7】:

            这行代码对我有用。

            <!--To disable dark mode-->
            <item name="android:forceDarkAllowed" tools:targetApi="q">false</item>
            

            【讨论】:

            • 试试这个代码。我已经在许多设备上进行了测试。
            【解决方案8】:

            您可以将它放在启动器活动的onCreate 方法的第一行。

            AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
            

            【讨论】:

            • 我认为的另一个解决方案是,您可以拥有一个 Light 主题,并将其放在 valuesvalues-nightstyle.xml 中。
            • 只是不要忘记这个解决方案会导致活动完全破坏和娱乐......
            • @inferus-vv 我不知道 React Native 但试试这个:Another solution I think is that you can have a Light theme, and put it in both style.xml in the values and values-night
            • 样式文件夹的解决方案是最好的选择。
            • false 需要 API 级别 29
            【解决方案9】:

            我经历了很多解决方案,但在我从“res”文件夹中删除“values-night”文件夹之前,没有一个是强大的。

            And change use parent theme: <style name="Theme.CryptoKite" parent="Theme.MaterialComponents.Light.DarkActionBar">
            

            【讨论】:

            • 这加上QB Tech的解决方案对我来说是完美的。
            【解决方案10】:

            除了 Fauzi Danartha 对 IMS 部分的回答。 可以使用

            扩展主题
            <item name="android:forceDarkAllowed" tools:targetApi="q"> false </item>
            

            不是来自 Material Design 的主题,而是来自 android:Theme.DeviceDefault.InputMethod(从 targetSdkVersion 14 开始)。

            也不需要调用getApplication().setTheme(),只需setTheme()就足够了。

            在 MIUI 12.0.4 上检查。

            【讨论】:

              【解决方案11】:

              &lt;style name="Theme.MyApp" parent="Theme.MaterialComponents.DayNight.DarkActionBar"&gt;

              将 DayNight 两个主题更改为 Light

              &lt;style name="Theme.MyApp" parent="Theme.MaterialComponents.Light.DarkActionBar"&gt;

              【讨论】:

                【解决方案12】:

                这对我有用(2021 年 4 月)

                1. 在您的主题下添加这一行:

                &lt;item name="android:forceDarkAllowed" tools:targetApi="q"&gt; false &lt;/item&gt;

                1. 删除themes.xml(夜间)文件(在values文件夹下)

                【讨论】:

                • styles.xml 中添加了这一行以及资源标签中的xmlns:tools="http://schemas.android.com/tools"。它对我没有用。我应该将它添加到其他地方吗?
                • 您应该将它添加到您的“themes.xml”文件中。可以在下面找到它:res > values > Themes.xml
                • 我正在使用 react native,显然它没有主题.xml 相反它有带有以下标签的样式.xml:&lt;style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"&gt; 所以我认为这一定是主题
                • 这个解决方案对我有用!谢谢!
                【解决方案13】:

                仅适用于 Cordova 开发人员的另一种选择:

                来自https://developer.android.com/guide/webapps/dark-theme

                "WebView 不能仅仅根据媒体查询的存在来区分,所以它需要一个带有深色值的颜色方案元标记来指示网页有自己的深色主题。为了防止双重变暗(即即,在媒体查询自定义之上应用颜色反转)WebView 在此模式下将 @media (prefers-color-scheme: dark) 评估为 false。"

                所以我将&lt;meta name="color-scheme" content="dark"&gt; 添加到我的html 和presto - 它现在检测我的prefers-color-scheme: dark 查询并且不应用自动变暗。

                【讨论】:

                  【解决方案14】:

                  使用以下行可以帮助您避免在应用中超载暗模式。

                  android:forceDarkAllowed="false"
                  

                  使用示例,

                  <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
                  xmlns:app="http://schemas.android.com/apk/res-auto"
                  xmlns:tools="http://schemas.android.com/tools"
                  android:layout_width="match_parent"
                  android:layout_height="match_parent"
                  android:orientation="vertical"
                  android:background="#FFFFFF"
                  android:forceDarkAllowed="false"
                  tools:context=".SplashActivity">
                  

                  【讨论】:

                  • 这个必须加到styles.xml中
                  【解决方案15】:

                  使用小米 Note 8 Pro MIUI 12.0.2 Android 10 测试

                  AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO); 添加到MainActivity.onCreate(); 似乎不起作用

                  可行的解决方案是在 styles.xml 的主 AppTheme 块中添加 &lt;item name="android:forceDarkAllowed"&gt;false&lt;/item&gt;

                  例子:

                  <style name="AppTheme" parent="Theme.MaterialComponents.Light.NoActionBar">
                      <item name="android:forceDarkAllowed" tools:targetApi="q">false</item>
                  </style>
                  

                  InputMethodService 更新:

                  对于InputMethodService / 也许如果我们在任何Service 中膨胀布局
                  我发现在 Dark Mode - Xiaomi MIUI 12.0.3 中有一种黑色会反转为白色。
                  为了防止反转,所以黑色仍然是黑色,请务必在InputMethodService中设置一个主题。

                  onCreate() 之前super.onCreate() 调用这些方法

                  • getApplication().setTheme()
                  • setTheme()

                  为了您的信息,我传递了Light Theme (Theme.MaterialComponents.Light.NoActionBar),其中有android:forceDarkAllowed=false
                  在我的情况下,InputMethodService 仅调用 getApplication().setTheme() 不足以防止倒置。

                  【讨论】:

                  • 可能是我的最佳答案:)
                  • 这是我一直在寻找的答案。在我的小米红米 Note 8 中,当我在系统中默认使用夜间模式时,当我选择白天模式时,我的应用程序不起作用。但是这个 false 在我的风格中运行良好。
                  • 没有styles.xml。编辑:在两个themes.xml 中添加它都有效。 Edit2:仍然需要 setDefaultNightMode 才能工作。
                  • edittexts 存在错误,在这种情况下,edittext 提示不可见。
                  【解决方案16】:

                  如果您想在整个应用中禁用夜间模式,Ali Rezaiyan 建议的正确方法是。

                  有时您只需要在某些活动或片段上禁用夜间模式(可能是因为遗留问题)。

                  所以你可以选择做什么:

                  • 禁用整个应用程序:

                    • AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)
                  • 为单个 Activity 禁用:

                    • getDelegate().setLocalNightMode(AppCompatDelegate.MODE_NIGHT_NO);
                    • 调用此函数后,您可能需要调用 recreate() 才能使其生效

                  【讨论】:

                    【解决方案17】:

                    简单地改变这个

                    <style name="YourThemeName" parent="Theme.MaterialComponents.DarkActionBar">
                    

                    <style name="YourThemeName" parent="Theme.AppCompat.Light.DarkActionBar">
                    

                    在主题和主题之夜

                    并确保主题和主题之夜的所有颜色都相同

                    【讨论】:

                    • 它不影响..因为android系统会自动更改应用程序的颜色..背景颜色或文本颜色没有在样式中多次声明
                    【解决方案18】:

                    在themes.xml 中更改:

                    <style name="Theme.MyApp" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
                    

                    <style name="Theme.MyApp" parent="Theme.MaterialComponents.Light.DarkActionBar">
                    

                    【讨论】:

                    • 这就是我要找的。但是,为了真正禁用夜间模式,我还删除了“themes.xml (night)”。
                    • 这是最好的,应该是公认的答案。简短而甜蜜。
                    • 夜间版在themes.xml中修改
                    【解决方案19】:

                    React Native、Ionic(cordova、电容器)

                    实际上,这个答案特别适用于 React Native 开发人员/应用程序:

                    就像我们都知道的那样,黑暗模式在 Android 10 上完全可用

                    深色主题在 Android 10(API 级别 29)及更高版本中可用

                    而且这个功能很可能会破坏您的应用设计实现,例如 SVG、字体和背景颜色。如果您决定完全禁用force dark mode,则应遵循以下方法:

                    1. &lt;style&gt; 文件中的&lt;style&gt; 标记中附加以下代码:

                      <item name="android:forceDarkAllowed">false</item>
                      

                      注意文件路径android/app/src/main/res/values/styles.xml

                    2. 在步骤 1 之后,您应该有如下内容:

                      <resources>
                        <!-- Base application theme. -->
                        <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
                            ...
                            <item name="android:forceDarkAllowed">false</item>
                        </style>
                      </resources>
                      
                    3. 也许上面的步骤对你没有帮助,但不要担心,就像这篇文章顶部所说的那样,这个功能是在 API 级别 29,这意味着您应该将 compiledSdkVersion 更改为 29 或更高。

                    4. 要更改compiledSdkVersion,您应该编辑android/app/build.gradle 文件中存在的app gradle 属性中的compiledSdkVersion

                      android {
                          compileSdkVersion 29
                      
                    5. 也许你面对compileSdkVersion rootProject.ext.compileSdkVersion,别担心你应该在android/build.gradle文件中存在的android gradle属性中改变这个:

                      buildscript {
                          ext {
                              buildToolsVersion = "SomeVersion"
                              minSdkVersion = SomeVersion
                              compileSdkVersion = 29 // <======= this should be 29 or higher
                              targetSdkVersion = SomeVersion
                      

                    提示:为确保您有一个新版本,请使用rm -rf android/app/build 命令完全删除您的上一个版本,然后在您的模拟器/设备上卸载该应用程序,然后再次运行yarn android .

                    【讨论】:

                    • 这个答案是属于我的,如果有问题,只要提到我。谢谢。
                    • @AmerllicA 我尝试了您的解决方案和 onCreate 中的方法,但没有任何效果。我制作了一个新版本并在我的小米 Mi 10T Lite 上进行了尝试
                    • @AldimirAleknsandrov,很奇怪,因为在任何情况下它都应该工作,实际上,使用这个解决方案你完全关闭了黑暗主题,请替换 30 而不是 29,也许它可以工作,请告诉我效果.
                    • @AmerllicA 我的默认值为 29,最小值为 21
                    • 看起来它不适用于小米设备,因为在我的小米米 9 上也不起作用。这可能是因为小米使用自定义主题操作系统 (MIUI)
                    【解决方案20】:

                    在要禁用强制黑暗的活动布局中,将以下属性放置在父布局中:

                    android:forceDarkAllowed="false"
                    

                    你的布局应该是这样的:

                    <?xml version="1.0" encoding="utf-8"?>
                    <androidx.constraintlayout.widget.ConstraintLayout 
                    xmlns:android="http://schemas.android.com/apk/res/android"
                    xmlns:app="http://schemas.android.com/apk/res-auto"
                    xmlns:tools="http://schemas.android.com/tools"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:forceDarkAllowed="false">
                    
                    <!-- ..... -->
                    
                    </androidx.constraintlayout.widget.ConstraintLayout>
                    

                    【讨论】:

                    • 这不适用于 xml 中的所有视图。我必须手动将此行添加到 textviews。好的解决方案是在样式文件夹中添加 false
                    【解决方案21】:

                    使用它作为禁用暗模式的父级 parent="Theme.AppCompat.Light.NoActionBar

                    【讨论】:

                      【解决方案22】:

                      如果您想避免 Activity 重新创建,您可以在 Application 类上设置标志,如提到的 here

                      我建议在您的应用程序类(如果有的话)中设置它,如下所示:

                      public class MyApplication extends Application {
                          
                          public void onCreate() {
                              super.onCreate();
                              AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
                          }
                      }
                      

                      【讨论】:

                        猜你喜欢
                        • 1970-01-01
                        • 1970-01-01
                        • 2020-12-26
                        • 1970-01-01
                        • 2018-05-09
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        相关资源
                        最近更新 更多