XamarinFormsのレンダラーを作成しようとしています。レンダラーは、選択した場合はEditText
の下線の色を「アクティブな色」に設定し、選択を解除した場合は「ヒントの色」に設定する必要があります。私の初期設定は次のようになります。
注:完全なソースファイルへのパスは次のとおりです
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の最初に選択した色を選択したactiveColor
/'フォーカスされた色'(紫)に設定するにはどうすればよいですか?
だから私にとっての解決策は純粋な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);
}
次のようにXfxEntryRendererDroid
ControlOnFocusChange
メソッドでコードを変更します。
private void ControlOnFocusChange(object sender, FocusChangeEventArgs args)
{
_hasFocus = args.HasFocus;
if (_hasFocus)
{
...
EditText.PostDelayed(() =>
{
//Add the following code
SetUnderlineColor(GetActivePlaceholderColor());
EditText.RequestFocus();
manager.ShowSoftInput(EditText, 0);
},
0);//Change it to 0
}
...
}
効果 。
これを使用して、実行時に色合いの色を変更してみませんか(テキスト変更イベントに含まれている可能性があります)。
ViewCompat.SetBackgroundTintList(_YourView , ColorStateList.ValueOf(Color.ParseColor(Resources.GetString(Resource.Color.blueLine))));
とにかくグッドラック!
EditTextのbackgroundTintListまたはsupportBackgroundTintListをインスタンスに設定する必要がありますColorStateListの
ColorStateList colorStateList = ColorStateList.valueOf(color)
editText.setSupportBackgroundTintList(colorStateList)
[〜#〜]または[〜#〜]
ボトムラインの色を変更したい場合は、以下のラインを使用して変更できると思います
editText.getBackground().mutate().setColorFilter(getResources().getColor(R.color.your_color), PorterDuff.Mode.SRC_ATOP);
そして、アプリケーションは次のように同じです:-
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
<item name="colorControlNormal">@color/colorAccent</item>
<item name="colorControlActivated">@color/colorAccent</item>
<item name="colorControlHighlight">@color/colorAccent</item>
</style>
これを確認してください 例