Как включить ночной режим программно?
Я ищу способ включить ночной режим программно с кодом 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 ответов
ПРОСТОЕ РЕШЕНИЕ
Вы можете включить / отключить темную тему, просто:
включить темную тему:
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
принудительно отключить темную тему:
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)
установить тему приложения на основе мобильных настроек темного режима, т.е. если темный режим включен, тогда тема будет установлена на темную тему, если нет, то на тему по умолчанию, но это будет работать только в версии>= Android версии Q
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM)
Примечания:
- Ваша основная тема для приложения / активности должна быть
"Theme.AppCompat.DayNight"
подобно
<style name="DarkTheme" parent="Theme.AppCompat.DayNight">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
</style>
- Имена вашей папки 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, и если вы являетесь автором этого вопроса и ваша проблема решена, поэтому не забудьте отметить решение и вопрос как исправленный.Спасибо
Помни это
Чтобы изменить режим приложения на ночь, используйте 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;
}