将android主题设置为跟随系统不会更改为当前系统主题

时间:2020-04-15 13:02:38

标签: c# android xamarin.android

在我的应用程序设置中,我可以使用它,以便您可以在应用程序的亮,暗和跟随系统之间切换主题。可以在它们之间进行切换,并且我已经进行了所有设置,但是,如果从其他主题之一切换为遵循系统,则如果之前的主题与系统不同,则不会更改为系统主题。

我正在使用以下代码切换主题:

        {
            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 :(得分:1)

您是否将主题更改为从DayNight变体之一扩展,然后调用一种方法来启用该功能?

例如:

<style name="MyTheme" parent="Theme.AppCompat.DayNight">

   .......
</style>

如果您使用的是Material Design Components(我建议您这样做),那么您也可以使用其v1.1.0版本中的Theme.MaterialComponents.DayNight主题。

您应该知道这两种方法。

setDefaultNightMode

该方法是静态的,因此您可以随时调用它。不过,您设置的值在整个进程启动时均会 not 保持不变,因此,您需要在每次启动应用程序进程时进行设置。我建议将其设置在您的应用程序类中(如果有的话)

像这样:

[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。

您可以通过调用每个组件的AppCompatDelegate的{​​{1}}覆盖默认值。当您知道只有某些组件应使用DayNight功能或用于开发时,这样就很方便了,这样您就不必坐下来等晚上摔下来测试布局。 现在,在每个“活动”中使用此方法都是一种反模式,您应该改为使用setLocalNightMode()

here

更新

我检查了源代码,当模式为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"); } (ModeNightFollowSystem),当我们调用mLocalNightMode = -1(-1)时,它将熄灭。

所以我找到了一种解决方法,先设置“当前夜间模式”,然后直接设置

Delegate.SetLocalNightMode(AppCompatDelegate.ModeNightFollowSystem);