gpt4 book ai didi

android - 如何以编程方式一致地设置 EditText 选定的下划线颜色

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:04:20 26 4
gpt4 key购买 nike

我正在尝试为 Xamarin Forms 构建渲染器。渲染器需要将 EditText 下划线颜色设置为选中时的“Activity 颜色”和取消选中时的“提示颜色”。我的初始设置看起来像这样。

注意:这里是完整源文件的路径
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。然后在“提示颜色”和“占位符颜色”之间切换。

注意:如果我将 SetUnderlineColor 方法更改为此(如下),它不再使用混合中的“提示颜色”,但我仍然得到 android: colorAccent 颜色作为初始下划线颜色,之后它的行为符合预期。

private void SetUnderlineColor(AColor color)
{
var bg = EditText.Background;
DrawableCompat.SetTint(bg,color);
EditText.SetBackground(bg);
}

我需要做什么才能将 EditText 的 INITIAL 选择颜色设置为我选择的 activeColor/'focused color'(紫色)?

在此动画中,我只是选择和取消选择 EditText enter image description here

最佳答案

所以我的解决方案是使用纯 AppCompat

所以我将 AppCompatEditText 添加到 TextInputLayout

protected EditText EditText => Control.EditText;

protected override TextInputLayout CreateNativeControl()
{
var textInputLayout = new TextInputLayout(Context);
var editText = new AppCompatEditText(Context)
{
SupportBackgroundTintList = ColorStateList.ValueOf(GetPlaceholderColor())
};
textInputLayout.AddView(editText);
return textInputLayout;
}

然后从那里我能够设置与此一致的下划线。

private void ControlOnFocusChange(object sender, FocusChangeEventArgs args)
{
_hasFocus = args.HasFocus;
SetUnderlineColor(_hasFocus ? GetActivePlaceholderColor(): GetPlaceholderColor());
}

private void SetUnderlineColor(AColor color)
{
var element = (ITintableBackgroundView)EditText;
element.SupportBackgroundTintList = ColorStateList.ValueOf(color);
}

full source code here.

关于android - 如何以编程方式一致地设置 EditText 选定的下划线颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47688399/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com