Как включить ночной режим программно?

Я ищу способ включить ночной режим программно с кодом 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);
    }

}

На моем экране ничего не изменилось, ночной режим по-прежнему отключается. По этой ссылке

Нет необходимости включать carMode или deskMode. У меня есть следующий logcat на 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

Спасибо за вашу помощь.

7 ответов

ПРОСТОЕ РЕШЕНИЕ

Вы можете включить / отключить темную тему, просто:

  1. включить темную тему:

    AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
    
  2. принудительно отключить темную тему:

    AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)
    
  3. установить тему приложения на основе мобильных настроек темного режима, т.е. если темный режим включен, тогда тема будет установлена ​​на темную тему, если нет, то на тему по умолчанию, но это будет работать только в версии>= Android версии Q

    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, чтобы можно было установить разные цвета и изображения для дневных и ночных тем, например

drawable & drawable-night,
значения и значения-ночь

Убедитесь, что тема по умолчанию изменена с Theme.AppCompat.Light.DarkActionBar в Theme.AppCompat.DayNight.DarkActionBar в файле styles.xml, а затем выполните AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES) переключиться в ночной режим. Я проверил его в APIv23(Android 6.0) и выше, и он работает нормально. Для лучшего объяснения смотрите эту кодовую метку на Android

У меня этот код отлично работает, хотя вам может потребоваться просто перезапустить приложение. Но имейте в виду, что этот код включает темный режим в масштабах всей системы, а не только в приложении:

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

Это сработало для меня в Киткате. Не забудьте проголосовать за меня, если я могу помочь вам, потому что мне действительно нужно много голосов, чтобы помогать другим больше naa, и если вы являетесь автором этого вопроса и ваша проблема решена, поэтому не забудьте отметить решение и вопрос как исправленный.Спасибо

Помни это не является . Они совершенно разные. DM был представлен в Android 10, который обеспечивает встроенный черный и белый цвет, в то время как NM был в более ранней версии, которая использует стиль по умолчанию / определенный стиль в зависимости от вашей реализации. Если вы хотите, чтобы ваше приложение использовало ваш стиль света / ночи и не полагалось на встроенный темный стиль, вы можете захотеть значение false в themes.xml или style.xml, поскольку DM может конфликтовать.

Чтобы изменить режим приложения на ночь, используйте AppCompatDelegate.

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

Еще одна вещь: ваша активность должна расширяться от AppCompatActivity.

Если он расширяет обычную Activity, то вызов AppCompatDelegate.setDefaultNightMode не будет работать.

NightOwl имеет собственную реализацию для переключения дневного / ночного режима на Android. Начать работу с NightOwl очень просто. Вот фрагмент кода:

Инициировать 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);
    }
});
      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;
}
Другие вопросы по тегам