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;