Измените ли вы тему, чтобы она расширялась от одного из DayNight
вариантов, а затем вызвали один метод для включения функции?
Например:
<style name="MyTheme" parent="Theme.AppCompat.DayNight">
.......
</style>
Если вы ' Если вы используете Material Design Components
(и я рекомендую вам это сделать), то вы также можете использовать тему Theme.MaterialComponents.DayNight
из их версии v1.1.0.
И вы должны знать два метода.
setDefaultNightMode
Этот метод является stati c, поэтому вы можете вызывать его в любое время. Значение, которое вы устанавливаете , а не , сохраняется при запуске процесса, поэтому вы должны устанавливать его при каждом запуске процесса приложения. Я рекомендую установить его в своем классе приложения (если он у вас есть)
примерно так:
[Application]
class MyApplication:Application
{
public MyApplication(IntPtr handle, JniHandleOwnership ownerShip) : base(handle, ownerShip)
{
}
public override void OnCreate()
{
base.OnCreate();
AppCompatDelegate.DefaultNightMode =
AppCompatDelegate.ModeNightFollowSystem;
}
}
setLocalNightMode
Настройка DayNight для одного Activity.
Вы можете переопределить значение по умолчанию в каждом компоненте, вызвав его AppCompatDelegate
setLocalNightMode()
. Это удобно, когда вы знаете, что только некоторые компоненты должны использовать функциональность DayNight или для разработки, чтобы вам не приходилось сидеть и ждать наступления ночи, чтобы протестировать макет. Использование этого метода в каждом действии теперь является анти-паттерном, и вам следует перейти к использованию setDefaultNightMode()
.
, чем больше вы можете посмотреть здесь
Обновление :
Я проверил исходный код, и кажется, что он пропускает обработку, когда режим ModeNightFollowSystem
public void setLocalNightMode(int mode) {
switch(mode) {
case -1:
case 0:
case 1:
case 2:
if (this.mLocalNightMode != mode) {
this.mLocalNightMode = mode;
if (this.mApplyDayNightCalled) {
this.applyDayNight();
}
}
break;
default:
Log.i("AppCompatDelegate", "setLocalNightMode() called with an unknown mode");
}
, если mLocalNightMode = -1
(ModeNightFollowSystem), и когда мы вызываем Delegate.SetLocalNightMode(AppCompatDelegate.ModeNightFollowSystem);
(- 1), он go выходит.
Так что я нахожу обходной путь, сначала получу режим Ночной ток, а затем установлю его прямо
case "System Preference":
UiModeManager uiManager = (UiModeManager)GetSystemService(UiModeService);
int mode = (int)uiManager.NightMode;
Delegate.SetLocalNightMode(mode);
prefs.Edit().PutString("theme", "System Preference").Commit();
break;