How to enable night mode programmatically?

33,704

Solution 1

SIMPLEST SOLUTION

You can enable/disable application's dark theme just by:

  1. enable dark theme:

     AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
    
  2. forcefully disable dark theme:

     AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)
    
  3. set app theme based on mobile settings of dark mode, i.e. if dark mode is enabled then the theme will be set to a dark theme, if not then the default theme, but this will only work in version >= Android version Q (10)

     AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM)
    

Notes:

  1. Your base theme for app/activity should be

"Theme.AppCompat.DayNight"

like

<style name="DarkTheme" parent="Theme.AppCompat.DayNight">
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
</style>
  1. Your res folder's names would end with -night so that different colors and images you can set for day and night themes like

drawable & drawable-night,
values & values-night

Solution 2

Make sure to change the default theme from Theme.AppCompat.Light.DarkActionBar to Theme.AppCompat.DayNight.DarkActionBar in the styles.xml file and then do AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES) to switch to the night mode. I have tested it in APIv23(Android 6.0) and above and it is working fine. For a better explanation see this codelab by Android

Solution 3

This code is working perfectly for me, though you may just need to restart your app. But keep in mind, that this code enables the Dark Mode system-wide, not just in the app:

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);
    }
}

This worked for me in Kitkat.

Solution 4

Remember that Dark Mode is not Night Mode. They are completely different. DM was introduce in Android 10 that enforce built-in black and white color while NM was on earlier version that uses either default/custom style depending on your implementation. If you want your app to use your custom light/night style and not relying on Android's built-in dark style, you may want to set forceDarkAllowed to false in themes.xml or style.xml as it can have conflict with DM.

To change your app mode to night you use AppCompatDelegate.

// This will be the top level handling of theme
        AppCompatDelegate.setDefaultNightMode(
            if (userPrefModeIsNight)
                AppCompatDelegate.MODE_NIGHT_YES
            else
                AppCompatDelegate.MODE_NIGHT_NO)
Share:
33,704
Ilan
Author by

Ilan

Updated on August 03, 2021

Comments

  • Ilan
    Ilan almost 3 years

    I am looking for a way to enable night mode programmatically with an Android code:

    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);
        }
    }
    

    Nothing has changed on my screen, the night mode is still disables. According to this link

    There is no need to enable carMode or deskMode. I have the following logcat on Android Studio:

    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
    
  • Vlad
    Vlad almost 4 years
    Google libraries will be the best choice
  • Mackovich
    Mackovich over 3 years
    Unless I am wrong, I believe OP was looking for a way to change night mode device-wise. Your code works perfectly fine app-wise. As I was looking for a way to change for the whole device, UiManager seems the right class to do so.
  • Mark Delphi
    Mark Delphi over 3 years
    Works perfectly for me!
  • Ton
    Ton over 3 years
    Hello Neeraj Sewani. I am trying to set an app that simply toggles the value of Night mode in the whole device. I am using uiManager.setNightMode(UiModeManager.MODE_NIGHT_YES) or MODE_NIGHT_NO. But I am not able to get it. Do I also have to change the "default theme" in my app? I don't mind how my app is displayed. I just want to change the device Night mode. Thanks.
  • yoonhok
    yoonhok over 3 years
    Works perfectly for me, too!