【问题标题】:Disable Dark Mode Programmatically in Android在 Android 中以编程方式禁用暗模式
【发布时间】:2021-06-19 08:05:27
【问题描述】:

我想以编程方式基于标志禁用应用程序中的暗模式。我在深色模式的 values-night 文件夹中定义了自定义颜色。

我尝试了以下禁用暗模式的解决方案,但没有奏效。

AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);

有没有办法在不删除 values-night 文件夹的情况下以编程方式禁用暗模式?

【问题讨论】:

    标签: android android-dark-theme android-darkmode


    【解决方案1】:

    似乎您没有定义正确的主题颜色。但请检查以下解决方案:

    Kt.

     val mode = if ((resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK) ==
                        Configuration.UI_MODE_NIGHT_NO
                    ) {
                        AppCompatDelegate.MODE_NIGHT_YES
                    } else {
                        AppCompatDelegate.MODE_NIGHT_AUTO_BATTERY
                    }
    
                AppCompatDelegate.setDefaultNightMode(mode)
    

    Colors.xml

    创建一个具有根/values-night/color.xml 的单独颜色 文件,并使用新的夜间主题颜色代码定义您在/values/color.xml 中定义的所有颜色。

    Themes.xml

    /values/themes.xml 中定义你的风格:

    <style name="Theme.VehicleApp" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
        <!-- Primary brand color. -->
        <item name="colorPrimary">@color/purple_700</item>
        <item name="colorPrimaryVariant">@color/purple_700</item>
        <item name="colorOnPrimary">@color/white</item>
    
        <!-- All your theme stuff -->
    
        </style>
    

    并且在您的/values-night/themes.xml 中仅定义您希望在夜间模式下更改的样式,否则不要定义您已经在 values/themes.xml 中定义的相同样式字段,其余的颜色操作工作将由颜色文件本身完成:

       <style name="Theme.VehicleApp" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
        
        <!-- Customize your theme here. -->
    
       </style>
    

    【讨论】:

      【解决方案2】:

      阅读setNightMode

      private UiModeManager uiModeManager;
      
      uiModeManager = (UiModeManager) getSystemService(UI_MODE_SERVICE); 
      uiModeManager.setNightMode(UiModeManager.MODE_NIGHT_NO);
      

      或者您可以在样式部分添加以下内容

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

      【讨论】:

      • 两者都不适合我。在暗模式下,它从 values-night 文件夹中获取颜色。
      • @Shyam 设置你的主题parent="Theme.MaterialComponents.Light.DarkActionBar"
      • 将其设置为@style/Theme.AppCompat.Light 并尝试过。但没有运气。
      • @Shyam 嗨,您使用的是 MaterialComponents 库还是默认库?
      【解决方案3】:

      将暗模式设置为 false 的代码将根据两个因素起作用,无论是使用 setDefaultNightMode() 还是 setLocalNightMode() 设置夜间模式。暗模式setDefaultNightMode() 值将在活动中被setLocalNightMode() 设置的值覆盖。所以始终建议使用本地上下文(Activity 上下文)来解析颜色值,而不是应用程序上下文。

      有关详细信息,请参阅本文。

      DayNight - Dark mode handling

      确保在解析颜色时使用正确的上下文。如果您使用 Application 上下文解析颜色,其值将不同于使用 Activity 上下文解析的值。

      Resolving dark mode colors from xml。 - 参考这个链接。

      【讨论】:

        【解决方案4】:

        您可以使用带有 int 标识符的变量来获取 UI 模式,然后将此变量放在条件语句中以选择 UI 的状态,然后编写上面使用的行

        int nightModeFlags = getContext().getResources().getConfiguration().uiMode &
        Configuration.UI_MODE_NIGHT_MASK;
        switch (nightModeFlags) {
        
          case Configuration.UI_MODE_NIGHT_YES:
             AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
             break;
        
          case Configuration.UI_MODE_NIGHT_NO:
             AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
             break; 
        }
        

        我希望这个解释能解决你的问题

        【讨论】:

          【解决方案5】:

          每次您想将模式从灯光模式更改为夜间模式时,您都必须调用

          setContentView(R.layout.YOUR_LAYOUT_NAME_FOR_THE_ACTIVITY); //this is also called in the onCreate() method
          

          所以这些函数会改变主题:

          private void setThemeDark(){
              AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
              setContentView(R.layout.YOUR_LAYOUT_NAME_FOR_THE_ACTIVITY);
          }
          
          private void setThemeLight(){
              AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
              setContentView(R.layout.YOUR_LAYOUT_NAME_FOR_THE_ACTIVITY);
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2021-10-22
            • 1970-01-01
            • 2021-11-10
            • 1970-01-01
            • 2022-06-28
            • 1970-01-01
            • 2021-08-28
            相关资源
            最近更新 更多