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

C# 将android主题设置为跟随系统不会更改为当前系统主题,c#,android,xamarin.android,C#,Android,Xamarin.android,在我的应用程序的设置中,我有它,这样你就可以在明暗和跟随系统之间切换应用程序的主题。在它们之间切换很好,我有所有的设置,但是当从其他主题切换到跟随系统时,如果之前的主题与系统不同,则不会更改为系统主题 我正在使用此代码切换主题: { Spinner spinner = (Spinner)sender; string selectedSpinnerItem = spinner.GetItemAtPosition(e.Position)

在我的应用程序的设置中,我有它,这样你就可以在明暗和跟随系统之间切换应用程序的主题。在它们之间切换很好,我有所有的设置,但是当从其他主题切换到跟随系统时,如果之前的主题与系统不同,则不会更改为系统主题

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

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


这发生在我主要活动的一个片段中。

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

例如:

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

   .......
</style>

为单个活动设置昼夜

您可以通过调用其
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
(ModeNightFollowsSystem),当我们调用
Delegate.SetLocalNightMode(AppCompatDelegate.ModeNightFollowsSystem)时(-1)它将熄灭

所以我找到了一个解决方法,首先获取当前的夜间模式,然后直接设置它

case "System Preference":
     UiModeManager uiManager = (UiModeManager)GetSystemService(UiModeService);
     int mode = (int)uiManager.NightMode;
     Delegate.SetLocalNightMode(mode);
     prefs.Edit().PutString("theme", "System Preference").Commit();
   break;
    

是的,我已经在我的样式中实现了昼夜主题,但是与本地夜间模式相比,您描述的设置默认夜间模式根本不会改变我的应用程序的主题。即使我在之后添加了一个活动“重新创建”,使用微调器切换到明暗效果很好,但如果先前的应用程序主题和操作系统主题不同,切换到跟随系统不会切换…你能分享一个简化的项目吗?请查看我编辑的评论,我可以发送我用于微调器切换主题的代码。我现在已将当前微调器代码添加到我的问题和一段视频behaviour@euandeas好的,我明白了,我会检查一下,然后再给你答复
case "System Preference":
     UiModeManager uiManager = (UiModeManager)GetSystemService(UiModeService);
     int mode = (int)uiManager.NightMode;
     Delegate.SetLocalNightMode(mode);
     prefs.Edit().PutString("theme", "System Preference").Commit();
   break;