Как включить OS AppTheme Dark / Light во время выполнения в Xamarin Forms - PullRequest
0 голосов
/ 21 июня 2020

Я следую Отвечать на изменение системной темы , чтобы ответить на тему ОС в приложении формы xamarin. Приложение поддерживает как темные, так и светлые темы с AppThemeBinding. Я не использую никаких пользовательских тем. Я слежу только за темами ОС. Итак, у меня есть Switch, который пользователь предпочел бы включить темный режим (такой же, как ОС). Ссылка предлагает следующий код для включения указанного режима (например, темного режима).

Application.Current.UserAppTheme = OSAppTheme.Dark;

Приведенный выше код ничего не делает, но если я напишу приведенный выше код в App.cs после InitializeComponent(), приложение изменится на Dark Mode.

Затем я решил перезапустить MainActivity в Android, что я сделал с помощью Dependency.

[assembly: Dependency(typeof(AndroidThemeChanged))]
    public class AndroidThemeChanged : ITheme
        {
            public void OnThemeChanged()
            {
                var activity = CrossCurrentActivity.Current.Activity;
                var intent = GetLauncherActivity();
                activity.Finish();
                activity.StartActivity(intent);
            }
            public static Intent GetLauncherActivity()
            {
                var packageName = AndroidApp.Context.PackageName;
                return AndroidApp.Context.PackageManager.GetLaunchIntentForPackage(packageName);
            }
        }

и вызвав его

if (Device.RuntimePlatform == Device.Android)
   DependencyService.Get<ITheme>().OnThemeChanged();

Есть ли способ обновить тему приложения независимо от OS theme (Темный / Светлый) без перезапуска MainActivity?

Ответы [ 2 ]

0 голосов
/ 21 июня 2020

Плохо, думаю, я ошибался. Код в моем вопросе работает должным образом. Мне не нужна эта Android служба для перезапуска деятельности. Вызов из любой точки ниже меняет тему на Dark независимо от темы ОС.

Application.Current.UserAppTheme = OSAppTheme.Dark;

0 голосов
/ 21 июня 2020

Думаю, вам не нужно перезапускать MainActivity. Согласно документации здесь мы можем реагировать на изменения темы с помощью события Application.Current.RequestedThemeChanged.

Пожалуйста, убедитесь, что вы используете расширение разметки AppThemeBinding в соответствии с документацией здесь .

Попробуйте следующий код.

Application.Current.RequestedThemeChanged += Current_RequestedThemeChanged;

private void Current_RequestedThemeChanged(object sender, AppThemeChangedEventArgs e)
{
    if (e.RequestedTheme == OSAppTheme.Dark)
        Application.Current.UserAppTheme = OSAppTheme.Dark;
    else
        Application.Current.UserAppTheme = OSAppTheme.Light;
}

Надеюсь, это поможет.

...