Android-рендерер Xamarin Switch 'Tint Color' делает переключатели исчезающими - PullRequest
0 голосов
/ 27 апреля 2018

Я использую пользовательский рендер для Xamarin Forms. Все, что я хочу сделать, это изменить цвет включения переключателя ...

У меня есть собственный класс для моего переключателя, и я добавил привязываемое свойство 'TintColour'.

public class ExtendedSwitch : Switch
{
    //Solution from: https://github.com/XLabs/Xamarin-Forms-Labs/blob/master/src/Forms/XLabs.Forms/Controls/ExtendedSwitch.cs

    /// <summary>
    /// Bindable tint colour property (sets colour of switch).
    /// </summary>
    public static readonly BindableProperty TintColorProperty = BindableProperty.Create(
        nameof(TintColor),
        typeof(Color),
        typeof(ExtendedSwitch),
        defaultValue: Color.FromHex(Constants.kProtirusBlueHexString)
    );

    /// <summary>
    /// Gets or sets the color of the tint.
    /// </summary>
    /// <value>The color of the tint.</value>
    public Color TintColor
    {
        get { return (Color)GetValue(TintColorProperty); }

        set { SetValue(TintColorProperty, value); }
    }
}

Я установил свои переключатели в XAML здесь:

<controls:ExtendedSwitch TintColor="Black" Grid.Column="2" Grid.Row="0" IsToggled="true"/>
<controls:ExtendedSwitch TintColor="Green" Grid.Column="2" Grid.Row="1" IsToggled="true"/>
<controls:ExtendedSwitch TintColor="Gray" Grid.Column="2" Grid.Row="2" IsToggled="true"/>
<controls:ExtendedSwitch TintColor="Blue" Grid.Column="2" Grid.Row="3" IsToggled="true"/>
<controls:ExtendedSwitch TintColor="#ff9200" Grid.Column="2" Grid.Row="4" IsToggled="true"/>
<controls:ExtendedSwitch TintColor="Gray" Grid.Column="2" Grid.Row="5" IsToggled="true"/>
<controls:ExtendedSwitch TintColor="Red" Grid.Column="2" Grid.Row="6" IsToggled="true"/>

И я реализовал рендер в iOS:

public class ExtendedSwitchRenderer : SwitchRenderer
{
    /// <summary>
    /// Get the current state of Extended Switch.
    /// </summary>
    /// <value>The element.</value>
    public new ExtendedSwitch Element
    {
        get { return (ExtendedSwitch)base.Element; }
    }


    /// <summary>
    /// Apply Tint Colour to Switch.
    /// </summary>
    /// <param name="sender">Sender.</param>
    /// <param name="e">E.</param>
    protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        base.OnElementPropertyChanged(sender, e);

        if (Control != null)
        {
            Control.OnTintColor = Element.TintColor.ToUIColor();
        }
    }
}

И посмотри, как красиво это выглядит ...

iOS behaves nicely & gives the intended result.

Теперь мы подошли к реализации рендерера для Android, и он просто отказывается работать.

Во-первых, я скажу, что это должно быть сделано в коде. Я НЕ МОГУ использовать стиль / тему для достижения этой цели, поскольку каждый переключатель должен иметь свой цвет.

Сначала давайте посмотрим на мой код Android: ** РЕДАКТИРОВАТЬ *** Я добавил полный класс рендерера, а не просто код, влияющий на переключатель *

public class ExtendedSwitchRenderer : SwitchRenderer
{
    public ExtendedSwitchRenderer(Context context) : base(context)
    {
    }

    /// <summary>
    /// Get the current state of Extended Switch.
    /// </summary>
    /// <value>The element.</value>
    public new ExtendedSwitch Element
    {
        get { return (ExtendedSwitch)base.Element; }
    }

    protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        base.OnElementPropertyChanged(sender, e);
        if (Control != null)
        {
            this.SetTintColor(Element.TintColor);
        }
    }

    /// <summary>
    /// Sets the color of the tint.
    /// </summary>
    /// <param name="color">The color.</param>
    private void SetTintColor(Xamarin.Forms.Color color)
    {
        //Colours currently hard coded but I will pass `Element.TintColour` to them
        Android.Graphics.Color colorOn = Android.Graphics.Color.Green;
        Android.Graphics.Color colorOff = Android.Graphics.Color.Gray;
        Android.Graphics.Color colorDisabled = Android.Graphics.Color.Green;

        StateListDrawable drawable = new StateListDrawable();
        drawable.AddState(new int[] { Android.Resource.Attribute.StateChecked }, new ColorDrawable(colorOn));
        drawable.AddState(new int[] { -Android.Resource.Attribute.StateEnabled }, new ColorDrawable(colorDisabled));
        drawable.AddState(new int[] { }, new ColorDrawable(colorOff));

        this.Control.ThumbDrawable = drawable;
    }
}

Когда я загружаю страницу с включенными переключателями, они полностью отсутствуют. Цвета не установлены, переключатели отсутствуют.

Я также попытался установить Control.ThumbStateList с помощью ColorStateList, но происходит то же самое, переключатели исчезают.

Как я могу заставить это работать? Я проверил код для реализации XLabs Forms этого рендерера , и он такой же, как у меня, и не работает. Кто-нибудь знает, как я могу настроить его так, чтобы мои переключатели имели другой цвет при выборе на Android.

Примечание: я не хочу использовать эффект. Я следовал инструкциям в этом руководстве для достижения того же с помощью эффекта. Но это не сработало даже на iOS, поэтому я был на шаг позади того, где я сейчас нахожусь ...

Любая и вся помощь будет оценена!

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