首页 > 解决方案 > Xamarin Switch 'Tint Colour' Android 渲染器使开关消失

问题描述

我正在为 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 表现良好并给出了预期的结果。

现在,我们来实现一个 android 渲染器,它只是拒绝工作。

首先我会说这必须在代码中完成,我不能使用样式/主题来实现这一点,因为每个开关必须是不同的颜色。

首先让我们看看我的 android 代码:**EDIT***我添加了完整的渲染器类,而不仅仅是影响开关的代码*

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.ThumbStateListColorStateList但是发生了完全相同的事情,开关消失了。

我怎样才能让它工作?我检查了XLabs Forms 实现此渲染器的代码,它与我的相同,但不起作用。有没有人知道如何设置它,以便在 Android 上选择我的开关时具有不同的颜色。

旁注,我不想使用效果。我按照本指南中的步骤使用效果实现相同的目标。但这甚至在 iOS 上也不起作用,所以我比现在落后了一步......

任何和所有的帮助将不胜感激!

标签: xamarinxamarin.formsxamarin.android

解决方案


推荐阅读