Я пытаюсь создать рендер для Xamarin Forms. Ридеру необходимо установить цвет подчеркивания EditText
на "Активный цвет" при выборе и "Цвет подсказки" при отмене выбора. Моя первоначальная настройка выглядит примерно так.
note: здесь путь к полному исходному файлу
https://github.com/XamFormsExtended/Xfx.Controls/blob/issue-%236/src/Xfx.Controls.Droid/Renderers/XfxEntryRendererDroid.cs
// called when control is created or when Colors are changed.
protected virtual void SetLabelAndUnderlineColor()
{
var defaultColor = GetPlaceholderColor();
var activeColor = GetActivePlaceholderColor();
SetHintLabelDefaultColor(defaultColor);
SetHintLabelActiveColor(activeColor);
SetUnderlineColor(_hasFocus ? activeColor : defaultColor);
}
private void SetUnderlineColor(AColor color)
{
var bg = ColorStateList.ValueOf(color);
ViewCompat.SetBackgroundTintList(EditText,bg);
}
private void SetHintLabelActiveColor(AColor color)
{
var hintText = Control.Class.GetDeclaredField("mFocusedTextColor");
hintText.Accessible = true;
hintText.Set(Control, new ColorStateList(new int[][] { new[] { 0 } }, new int[] { color }));
}
private void SetHintLabelDefaultColor(AColor color)
{
var hint = Control.Class.GetDeclaredField("mDefaultTextColor");
hint.Accessible = true;
hint.Set(Control, new ColorStateList(new int[][] { new[] { 0 } }, new int[] { color }));
}
Кроме этого, у меня также есть OnClickListener, который обновляет подчеркивание только тогда, когда состояние изменяет
private void ControlOnFocusChange(object sender, FocusChangeEventArgs args)
{
_hasFocus = args.HasFocus;
SetUnderlineColor(args.HasFocus ? GetPlaceholderColor() : GetActivePlaceholderColor());
}
Проблема в том, что когда я нажимаю на EditText, он попадает или пропускает, что я увижу для подчеркивания цвета.
Я могу в значительной степени гарантировать, что это будет первый раз по умолчанию android:colorAccent
. Затем после этого он переключается между "Цвет подсказки" и "Цвет заполнитель".
note: если я изменил метод SetUnderlineColor
на это (ниже), он больше не использует "цвет подсказки" в миксе, но я все равно получаю цвет android:colorAccent
в качестве исходного цвета подчеркивания, после чего он ведет себя так, как ожидалось.
private void SetUnderlineColor(AColor color)
{
var bg = EditText.Background;
DrawableCompat.SetTint(bg,color);
EditText.SetBackground(bg);
}
Что мне нужно сделать, чтобы установить INITIAL выбранный цвет EditText на мой выбранный activeColor
/'сфокусированный цвет? (фиолетовый)?
В этой анимации я просто выбираю и снимаю выделение с EditText