【问题标题】:How to enable night mode programmatically?如何以编程方式启用夜间模式?
【发布时间】:2018-05-09 18:47:11
【问题描述】:

我正在寻找一种使用 Android 代码以编程方式启用夜间模式的方法:

public static void setNightMode(Context target, boolean state){

    UiModeManager uiManager = (UiModeManager) target.getSystemService(Context.UI_MODE_SERVICE);

    if (state) {
        //uiManager.enableCarMode(0);
        uiManager.setNightMode(UiModeManager.MODE_NIGHT_YES);
    } else {
        // uiManager.disableCarMode(0);
        uiManager.setNightMode(UiModeManager.MODE_NIGHT_NO);
    }
}

我的屏幕上没有任何变化,夜间模式仍处于禁用状态。 据此link

无需启用 carMode 或deskMode。 我在 Android Studio 上有以下 logcat:

11-26 12:15:16.662 3823-3823/? D/UiModeManager: updateConfigurationLocked: mDockState=0; mCarMode=false; mNightMode=2; uiMode=33
11-26 12:15:26.802 3823-3823/? V/UiModeManager: updateLocked: null action, mDockState=0, category=null

【问题讨论】:

  • 我想在任何地方更改夜间模式,而不是在我的应用程序中。我不需要切换某些主题。
  • 你检查过这个注释了吗? “注意:在 API 22 及更低版本中,只有在设备上启用了汽车或桌面模式时,对夜间模式的更改才有效。从 API 23 开始,对夜间模式的更改始终有效。”
  • 你能解决这个问题吗?我正在努力使用 setNightMode,但无法在 Android 10 或 11 上使用它

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


【解决方案1】:

最简单的解决方案

您可以通过以下方式启用/禁用应用程序的深色主题:

  1. 启用深色主题:

     AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
    
  2. 强制禁用深色主题:

     AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)
    
  3. 根据暗模式的移动设置设置应用程序主题,即如果启用暗模式,则主题将设置为暗主题,否则 默认主题,但这仅适用于 version >= Android version Q (10)

     AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM)
    

注意事项:

  1. 您的应用/活动的基本主题应该是

“Theme.AppCompat.DayNight”

喜欢

<style name="DarkTheme" parent="Theme.AppCompat.DayNight">
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
</style>
  1. 您的 res 文件夹的名称将以 -night 结尾,以便您可以为白天和夜间主题设置不同的颜色和图像,例如

可绘制和可绘制的夜晚,
价值观与价值观-之夜

【讨论】:

  • 除非我错了,否则我相信 OP 正在寻找一种方法来改变夜间模式的设备。您的代码在应用程序方面工作得非常好。当我正在寻找一种方法来改变整个设备时,UiManager 似乎是这样做的正确类。
  • 非常适合我!
  • 也非常适合我!
【解决方案2】:

确保在 styles.xml 文件中将默认主题从 Theme.AppCompat.Light.DarkActionBar 更改为 Theme.AppCompat.DayNight.DarkActionBar,然后执行 AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES) 以切换到夜间模式。我已经在 APIv23(Android 6.0)及更高版本中对其进行了测试,并且运行良好。 如需更好的解释,请参阅this codelab by Android

【讨论】:

  • 你好 Neeraj Sewani。我正在尝试设置一个简单地在整个设备中切换夜间模式值的应用程序。我正在使用 uiManager.setNightMode(UiModeManager.MODE_NIGHT_YES) 或 MODE_NIGHT_NO。但我无法得到它。我是否还必须更改我的应用程序中的“默认主题”?我不介意我的应用程序是如何显示的。我只想更改设备夜间模式。谢谢。
【解决方案3】:

此代码对我来说非常有效,尽管您可能只需要重新启动您的应用程序。但请记住,此代码在系统范围内启用暗模式,而不仅仅是在应用程序中:

public static void setNightMode(Context target , boolean state){

    UiModeManager uiManager = (UiModeManager) target.getSystemService(Context.UI_MODE_SERVICE);

    if (VERSION.SDK_INT <= 22) {
        uiManager.enableCarMode(0);
    }
    
    if (state) {
        uiManager.setNightMode(UiModeManager.MODE_NIGHT_YES);
    } else {
        uiManager.setNightMode(UiModeManager.MODE_NIGHT_NO);
    }
}

这在 Kitkat 中对我有用。

【讨论】:

    【解决方案4】:

    NightOwl 有自己的实现,用于在 Android 上切换昼夜模式。开始使用 NightOwl 非常简单。这是一个代码sn-p:

    在Application类中初始化NightOwl,

    NightOwl.builder().defaultMode(0).create();
    

    在你的 Activity 类中调用三个方法,

    public class DemoActivity extends AppCompatActivity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            // step1 before super.onCreate
            NightOwl.owlBeforeCreate(this);
    
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_demo);
    
            // step2 after setContentView
            NightOwl.owlAfterCreate(this);
    
            // write your code
        }
    
        @Override
        protected void onResume() {
            super.onResume();
    
            // step3 onResume
            NightOwl.owlResume(this);
        }
    
    }
    

    随心所欲切换皮肤,

    View v = findViewById(R.id.button);
    v.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            NightOwl.owlNewDress(SettingActivity.this);
        }
    });
    

    【讨论】:

    • 谷歌图书馆将是最佳选择
    【解决方案5】:

    记住Dark Mode 不是Night Mode。它们完全不同。 DM 是在 Android 10 中引入的,它强制内置黑白颜色,而 NM 在早期版本上使用默认/自定义 m 样式,具体取决于您的实现。如果您希望您的应用程序使用自定义的灯光/夜间样式而不依赖于 Android 的内置深色样式,您可能需要在 theme.xml 或 style.xml 中 forceDarkAllowedfalse,因为它可能与 DM 发生冲突.

    要将应用模式更改为夜间模式,请使用 AppCompatDelegate。

    // This will be the top level handling of theme
            AppCompatDelegate.setDefaultNightMode(
                if (userPrefModeIsNight)
                    AppCompatDelegate.MODE_NIGHT_YES
                else
                    AppCompatDelegate.MODE_NIGHT_NO)
    

    【讨论】:

      猜你喜欢
      • 2014-01-18
      • 2013-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-25
      • 2019-12-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多