Установка темы android в соответствии с системой не меняется на текущую тему системы - PullRequest
0 голосов
/ 15 апреля 2020

В настройках моего приложения он у меня есть, так что вы можете переключать тему из приложения между Light, Dark и Follow system. Переключение между ними в порядке, и у меня есть все настройки, однако при переключении на следующую систему из одной другой темы она не меняется на системную тему, если предыдущая тема отличалась от системной.

Я использую этот код для переключения темы:

        {
            Spinner spinner = (Spinner)sender;
            string selectedSpinnerItem = spinner.GetItemAtPosition(e.Position).ToString();
            string chosenTheme = prefs.GetString("theme", "Light");

            if (selectedSpinnerItem != chosenTheme)
            {
                switch (selectedSpinnerItem)
                {
                    case "Light":
                        ((AppCompatActivity)Activity).Delegate.SetLocalNightMode(AppCompatDelegate.ModeNightNo);
                        prefs.Edit().PutString("theme", "Light").Commit();
                        break;
                    case "Dark":
                        ((AppCompatActivity)Activity).Delegate.SetLocalNightMode(AppCompatDelegate.ModeNightYes);
                        prefs.Edit().PutString("theme", "Dark").Commit();
                        break;
                    case "System Preference":
                        ((AppCompatActivity)Activity).Delegate.SetLocalNightMode(AppCompatDelegate.ModeNightFollowSystem);
                        prefs.Edit().PutString("theme", "System Preference").Commit();
                        break;
                }
            }
        }

https://imgur.com/a/NBDFMCs

Это происходит во фрагменте моей основной деятельности.

1 Ответ

0 голосов
/ 16 апреля 2020

Измените ли вы тему, чтобы она расширялась от одного из 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;
...