在Xamarin中获取Android的系统主题设置,Forms

eanckbw9  于 2023-01-18  发布在  Android
关注(0)|答案(1)|浏览(128)

我有三个单选按钮用于选择应用的主题:Default,它应该应用在Android的系统设置中选择的任何主题,LightDark
问题是,无论何时我选择了Default单选按钮,它都不会像我期望的那样返回一个标准值,而是返回OSAppTheme.LightOSAppTheme.Dark,无论之前的设置是什么,换句话说,它重新应用了之前的设置。
下面是我的代码:

private void DarkMode(object sender, CheckedChangedEventArgs e)
    {
        if (defaultRadioButton.IsChecked == true)
        {
            if (Application.Current.RequestedTheme != OSAppTheme.Unspecified)
            {
                Application.Current.UserAppTheme = Application.Current.RequestedTheme;
            }
            else
            {
                Application.Current.UserAppTheme = OSAppTheme.Light;
            }
        }
        else if (lightRadioButton.IsChecked == true)
        {
            Application.Current.UserAppTheme = OSAppTheme.Light;
        }
        else if (darkRadioButton.IsChecked == true)
        {
            Application.Current.UserAppTheme = OSAppTheme.Dark;
        }
     }

我的印象是Application.Current.RequestedTheme总是携带系统的设置,从我遇到的行为来看,我猜这不是真的。
如果Application.Current.RequestedTheme没有获得系统的主题设置,那么检测用户是否在操作系统级别启用了Dark Mode的正确方法是什么?

8zzbczxx

8zzbczxx1#

根据Manually apply dark theme in Xamarin.Forms的这种情况,Application.Current.UserAppTheme只适用于AppThemeBinding定义的主题。
因此,如果要使用此属性更改用户界面的主题,则需要在控件中使用AppThemeBinding,例如官方文档中的示例代码。
此外,Application.Current.RequestedTheme确实可以获取设备系统的当前主题,但您也可以尝试在MainActivity中使用以下代码获取android设备的当前主题:

var theme = this.Resources.Configuration.UiMode & Android.Content.Res.UiMode.NightMask;
//if the value is Android.Content.Res.UiMode.NightNo means the device is using light mode
//if the value is Android.Content.Res.UiMode.NightYes means the device is using dark mode

然后,您可以在Project.Droid/Resource/values/style.xml中声明一个dark主题并使用它,或者像官方文档那样使用AppThemeBinding在应用程序中应用dark主题。

    • 更新**

1.将设备的主题设置为深色
1.调用上面的代码:

Application.Current.UserAppTheme = OSAppTheme.Light;
var theme = Application.Current.RequestedTheme;

值会变暗。应该是bug,你可以在github上报告。

相关问题