Как программно изменить режим «Светлый» на «Темный» в Xamarin.Forms Android и / или программно изменить цвет полосы прокрутки? - PullRequest
1 голос
/ 11 апреля 2020

Я хочу разрешить моему пользователю выбирать AppTheme так, как он хочет. Ниже приведены параметры, которые я хочу указать: -

  1. Automati c (согласно выбору пользователя в настройках).
  2. Светлый режим
  3. Темный режим

Я нашел решение использовать следующий код: -

        if(theme == App.Theme.Light)
        {
            Delegate.SetLocalNightMode(AppCompatDelegate.ModeNightNo);
        } else
        {
            Delegate.SetLocalNightMode(AppCompatDelegate.ModeNightYes);
        }

Но этот код воссоздает всю активность, и после нажатия на кнопку я снова попадаю на страницу входа моего приложения.

Может кто-нибудь предложить мне способ программного перехода из светлого режима в темный режим в Xamarin.Forms Android?

Также кто-нибудь знает другой способ, которым я мог бы программно изменить цвет полосы прокрутки.

Ответы [ 2 ]

1 голос
/ 11 апреля 2020

Имеют два файла стилей Light и Dark XAML и класс ThemeHelper, который переключает темы во время выполнения

См. Это https://github.com/jamesmontemagno/Hanselman.Forms/tree/vnext/src/Hanselman/Styles

Обновление

Как уже упоминалось, этот пример проекта имеет большие ресурсы для переключения тем.

Светлая тема

<?xml version="1.0" encoding="UTF-8" ?>
<ResourceDictionary
    xmlns="http://xamarin.com/schemas/2014/forms"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    x:Class="TestApp.LightTheme">
    <Color
        x:Key="TextColor">#ababab</Color>
    <Color
        x:Key="GenericBackground">#e3e3e3</Color>
    <Color
        x:Key="AppBackground">#FFFFFF</Color>
</ResourceDictionary>

Темная тема

<?xml version="1.0" encoding="UTF-8"?>
<ResourceDictionary
    xmlns="http://xamarin.com/schemas/2014/forms"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    x:Class="TestApp.DarkTheme">
    <Color
        x:Key="TextColor">#e3e3e3</Color>
    <Color
        x:Key="GenericBackground">#ababab</Color>
    <Color
        x:Key="AppBackground">#000000</Color>
</ResourceDictionary>

ThemeHelper

public class ThemeHelper
{

    public static Theme CurrentTheme = Theme.Light;

    public static void ChangeTheme(Theme theme, bool forceTheme = false)
    {
        // don't change to the same theme
        if (theme == CurrentTheme && !forceTheme)
            return;

        //// clear all the resources
        var applicationResourceDictionary = Application.Current.Resources;
        ResourceDictionary newTheme;
        if (theme == Theme.Default)
        {

            theme = AppInfo.RequestedTheme == AppTheme.Dark ? Theme.Dark : Theme.Light;
        }

        switch (theme)
        {
            case Theme.Light:
                newTheme = new LightTheme();
                break;
            case Theme.Dark:
                newTheme = new DarkTheme();
                break;
            case Theme.Default:
            default:
                newTheme = new LightTheme();
                break;
        }

        ManuallyCopyThemes(newTheme, applicationResourceDictionary);

        CurrentTheme = theme;

        var background = (Color)App.Current.Resources["AppBackground"];

    }

    static void ManuallyCopyThemes(ResourceDictionary fromResource, ResourceDictionary toResource)
    {
        foreach (var item in fromResource.Keys)
        {
            toResource[item] = fromResource[item];
        }
    }
}

Theme enum

public enum Theme
{
    Default,
    Light,
    Dark
}

Перед запуском темы инициализации приложения вы можете получить ее из настроек приложения или из БД, такой как SQLite или API *

public App()
{
    InitializeComponent();
    ThemeHelper.ChangeTheme(Theme.Default);
    MainPage = new NavigationPage(new MainPage());
}

Убедитесь, что вы используете DynamicResource в этом подходе

<?xml version="1.0" encoding="utf-8"?>
<ContentPage
    xmlns="http://xamarin.com/schemas/2014/forms"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    xmlns:d="http://xamarin.com/schemas/2014/forms/design"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    BackgroundColor="{DynamicResource AppBackground}"
    x:Class="TestApp.MainPage">
    <ContentPage.ToolbarItems>
        <ToolbarItem
            Text="Default"
            Clicked="ToolbarItem_Clicked" />
        <ToolbarItem
            Text="Light"
            Clicked="ToolbarItem_Clicked_1" />
        <ToolbarItem
            Text="Dark"
            Clicked="ToolbarItem_Clicked_2" />
    </ContentPage.ToolbarItems>
    <StackLayout>
        <Label
            Text="Welcome to Xamarin.Forms!"
            HorizontalOptions="Center"
            VerticalOptions="CenterAndExpand"
            TextColor="{DynamicResource TextColor}"
            BackgroundColor="{DynamicResource GenericBackground}" />
        <Label
            x:Name="label"
            TextColor="{DynamicResource TextColor}"
            BackgroundColor="{DynamicResource GenericBackground}"
            HorizontalOptions="Center"
            VerticalOptions="CenterAndExpand" />
    </StackLayout>
</ContentPage>

Снимок экрана

image

You may still need some changes in Android with respect to different API levels.

Other reference

Theming Обнаружение темного режима

Android Dark Theme

0 голосов
/ 11 апреля 2020

Вы можете использовать DynamicResources для реализации функциональности темы Dynami c без перенаправления. Вы можете следить за этими документами .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...