在我的应用程序设置中,我可以使用它,以便您可以在应用程序的亮,暗和跟随系统之间切换主题。可以在它们之间进行切换,并且我已经进行了所有设置,但是,如果从其他主题之一切换为遵循系统,则如果之前的主题与系统不同,则不会更改为系统主题。
我正在使用以下代码切换主题:
{
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;
}
}
}
这是我主要活动的一部分。
答案 0 :(得分:1)
您是否将主题更改为从DayNight
变体之一扩展,然后调用一种方法来启用该功能?
例如:
<style name="MyTheme" parent="Theme.AppCompat.DayNight">
.......
</style>
如果您使用的是Material Design Components
(我建议您这样做),那么您也可以使用其v1.1.0版本中的Theme.MaterialComponents.DayNight
主题。
您应该知道这两种方法。
该方法是静态的,因此您可以随时调用它。不过,您设置的值在整个进程启动时均会 not 保持不变,因此,您需要在每次启动应用程序进程时进行设置。我建议将其设置在您的应用程序类中(如果有的话)
像这样:
[Application]
class MyApplication:Application
{
public MyApplication(IntPtr handle, JniHandleOwnership ownerShip) : base(handle, ownerShip)
{
}
public override void OnCreate()
{
base.OnCreate();
AppCompatDelegate.DefaultNightMode =
AppCompatDelegate.ModeNightFollowSystem;
}
}
为单个活动设置DayNight。
您可以通过调用每个组件的AppCompatDelegate
的{{1}}覆盖默认值。当您知道只有某些组件应使用DayNight功能或用于开发时,这样就很方便了,这样您就不必坐下来等晚上摔下来测试布局。
现在,在每个“活动”中使用此方法都是一种反模式,您应该改为使用setLocalNightMode()
。
更新:
我检查了源代码,当模式为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);