即使在android 9.0(pie)中启用了夜间模式,如何在我的应用程序中禁用夜间模式?

时间:2019-07-24 04:22:56

标签: android

我在发布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>

我的原色是红色。

18 个答案:

答案 0 :(得分:10)

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

有时候,您只需要在某些活动或仅禁用某些片段上禁用夜间模式(也许是由于遗留的东西)。

因此您可以选择要做什么:

  • 在整个应用中禁用:

    • AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)
  • 禁用单个活动:

    • getDelegate().setLocalNightMode(AppCompatDelegate.MODE_NIGHT_NO);
    • 调用此方法后,您可能需要调用recreate()才能生效

答案 1 :(得分:10)

反应本机,离子(cordova,电容器)

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

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

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

很可能该功能破坏了您的应用程序设计实现,如SVG,字体和背景色。如果您决定完全禁用force dark mode,则应遵循以下方法:

    <style>文件的styles.xml标记内
  1. 追加以下代码:

    <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,应编辑compiledSdkVersion文件中存在的 app gradle 属性中的android/app/build.gradle

    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命令完全删除上一个内部版本,然后在模拟器/设备上卸载该应用,然后运行{{ 1}}。

答案 2 :(得分:7)

在themes.xml中进行更改:

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

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

答案 3 :(得分:7)

这对我有用(2021 年 4 月)

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

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

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

答案 4 :(得分:7)

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

将两个主题 DayNight 更改为 Light

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

答案 5 :(得分:5)

如果您想避免进行Activity重新创建,可以按照here

在Application类上设置标志

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

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

答案 6 :(得分:2)

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

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>

答案 7 :(得分:1)

只需在 AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO); 后面添加 super.onCreate(savedInstanceState);

答案 8 :(得分:1)

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

AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);中添加MainActivity.onCreate();似乎无效

有效的解决方案是在<item name="android:forceDarkAllowed">false</item>的主AppTheme块内添加styles.xml

示例:

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

答案 9 :(得分:1)

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

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">

答案 10 :(得分:0)

简单地改变这个

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

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

在主题和主题之夜

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

答案 11 :(得分:0)

这行代码对我有用。

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

答案 12 :(得分:0)

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

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

答案 13 :(得分:0)

除了 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 上检查。

答案 14 :(得分:0)

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

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

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

所以我在我的 html 和 presto 中添加了 <meta name="color-scheme" content="dark"> - 它现在检测我的首选颜色方案:暗查询并且不应用自动变暗。

答案 15 :(得分:0)

如果您的应用程序不支持夜间模式,请尝试在应用程序中使用其他主题。与其使用links[Number(id)]=link 作为父主题,不如使用Theme.AppCompat.DayNight.DarkActionBar

答案 16 :(得分:0)

将此作为父级禁用暗模式 parent =“ Theme.AppCompat.Light.NoActionBar

答案 17 :(得分:0)

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

    AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)