¿Cómo habilitar el modo nocturno mediante programación?

5 minutos de lectura

Avatar de usuario de Ilan
Ilán

Estoy buscando una manera de habilitar el modo nocturno mediante programación con un código de 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);
    }
}

Nada ha cambiado en mi pantalla, el modo nocturno aún está desactivado. De acuerdo a esto enlace

No es necesario habilitar carMode o deskMode. Tengo el siguiente logcat en 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

  • prueba esto stackoverflow.com/questions/31934503/…

    – Munir

    26 de noviembre de 2017 a las 11:34

  • Quiero cambiar el modo nocturno en todas partes, no en mi aplicación. No necesito cambiar algunos temas.

    – Ilán

    26 de noviembre de 2017 a las 11:44

  • ¿Revisaste esta nota? “Nota: en API 22 y versiones anteriores, los cambios en el modo nocturno solo son efectivos cuando el modo de automóvil o escritorio está habilitado en un dispositivo. A partir de API 23, los cambios en el modo nocturno siempre son efectivos”.

    – Google

    29 de marzo de 2018 a las 6:00

  • ¿Pudiste resolver este problema? Tengo problemas con setNightMode y no puedo obtenerlo en Android 10 u 11

    – tonelada

    19 de noviembre de 2020 a las 8:28

Avatar de usuario de Kishan Solanki
Kishan Solanki

LA SOLUCIÓN MÁS SENCILLA

Puede habilitar/deshabilitar el tema oscuro de la aplicación con solo:

  1. habilitar tema oscuro:

     AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
    
  2. deshabilitar a la fuerza el tema oscuro:

     AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)
    
  3. configure el tema de la aplicación según la configuración móvil del modo oscuro, es decir, si el modo oscuro está habilitado, el tema se establecerá en un tema oscuro, si no, entonces el tema predeterminado, pero esto solo funcionará en versión >= Android versión Q (10)

     AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM)
    

Notas:

  1. Su tema base para la aplicación/actividad debe ser

“Tema.AppCompat.DayNight”

como

<style name="DarkTheme" parent="Theme.AppCompat.DayNight">
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
</style>
  1. Los nombres de su carpeta res terminarían con -night para que pueda configurar diferentes colores e imágenes para temas diurnos y nocturnos como

dibujable y dibujable-noche,
valores & valores-noche

  • A menos que me equivoque, creo que OP estaba buscando una forma de cambiar el modo nocturno en el dispositivo. Su código funciona perfectamente bien en cuanto a la aplicación. Mientras buscaba una forma de cambiar para todo el dispositivo, UiManager parece la clase adecuada para hacerlo.

    – Mackovich

    24 de agosto de 2020 a las 15:49

  • ¡Funciona perfectamente para mí!

    – Marcos Delfos

    11 de noviembre de 2020 a las 8:25

  • ¡A mí también me funciona perfectamente!

    – yoonhok

    15 dic 2020 a las 23:20

Asegúrese de cambiar el tema predeterminado de Theme.AppCompat.Light.DarkActionBar a Theme.AppCompat.DayNight.DarkActionBar en el estilos.xml archivar y luego hacer AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES) para cambiar al modo nocturno. Lo probé en APIv23 (Android 6.0) y superior y funciona bien. Para una mejor explicación ver este codelab de Android

  • Hola Neeraj Sewani. Estoy tratando de configurar una aplicación que simplemente cambie el valor del modo nocturno en todo el dispositivo. Estoy usando uiManager.setNightMode(UiModeManager.MODE_NIGHT_YES) o MODE_NIGHT_NO. Pero no soy capaz de conseguirlo. ¿También tengo que cambiar el “tema predeterminado” en mi aplicación? No me importa cómo se muestra mi aplicación. Solo quiero cambiar el modo Noche del dispositivo. Gracias.

    – tonelada

    19 de noviembre de 2020 a las 8:32

Avatar de usuario de DiLDoST
consolador

Este código funciona perfectamente para mí, aunque es posible que solo necesite reiniciar su aplicación. Pero tenga en cuenta que este código habilita el modo oscuro en todo el sistemano solo en la aplicación:

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

Esto funcionó para mí en Kitkat.

Avatar de usuario de Bitwise DEVS
DEVS bit a bit

Recuerda eso Dark Mode no es Night Mode. Son completamente diferentes. DM se introdujo en Android 10 que aplica el color blanco y negro incorporado, mientras que NM se lanzó en una versión anterior que usa un estilo predeterminado/personalizado comúnmente llamado como Calificadores de recursos. Si desea manejar su propio estilo personalizado de luz/noche y no confiar en el estilo oscuro integrado de Android, puede configurar forceDarkAllowed a false en themes.xml o style.xml para evitar conflictos.

Para cambiar el modo de su aplicación a la noche, use AppCompatDelegate.

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

Una cosa más: su actividad debe extenderse desde AppCompatActivity.

Si extiende la actividad simple, llamar a AppCompatDelegate.setDefaultNightMode no funcionará.

Avatar de usuario de Himanshu Yadav Anshu
Himanshu Yadav Anshu

int nightModeFlags =
getContext().getResources().getConfiguration().uiMode &
Configuration.UI_MODE_NIGHT_MASK;
switch (nightModeFlags) {
case Configuration.UI_MODE_NIGHT_YES:
     doStuff();
     break;

case Configuration.UI_MODE_NIGHT_NO:
     doStuff();
     break;

case Configuration.UI_MODE_NIGHT_UNDEFINED:
     doStuff();
     break;
}

Avatar de usuario de Prokash Sarkar
Prokash Sarkar

Noctámbulo tiene su propia implementación para cambiar el modo día/noche en Android. Comenzar con NightOwl es muy fácil. Aquí hay un fragmento de código:

Inicie NightOwl en la clase de aplicación,

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

Llame a tres métodos en su clase de Actividad,

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

}

Cambia la piel en todas partes como quieras,

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

  • Las bibliotecas de Google serán la mejor opción

    – Vlad

    28 de julio de 2020 a las 8:55

¿Ha sido útil esta solución?