在我的应用程序设置中,我可以使用它,以便您可以在应用程序的亮,暗和跟随系统之间切换主题。在它们之间切换是可以的,我拥有所有设置,但是,如果从其他主题之一切换为遵循系统,则如果之前的主题与系统不同,则不会更改为系统主题。
我正在使用此代码切换主题:
{
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>
[如果您正在使用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;
}
}
为单个活动设置日夜。
您可以通过调用其AppCompatDelegate
的setLocalNightMode()
覆盖每个组件中的默认值。当您知道只有某些组件应使用DayNight功能或用于开发时,这样就很方便了,这样您就不必坐下来等待晚上下来测试布局。现在,在每个“活动”中使用此方法都是一种反模式,您应该改为使用setDefaultNightMode()
。
您看起来here越多