web-dev-qa-db-ja.com

EditTextで選択した下線の色をプログラムで一貫して設定する方法

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/'フォーカスされた色'(紫)に設定するにはどうすればよいですか?

このアニメーションでは、EditTextを選択および選択解除しているだけです enter image description here

11
Chase Florell

だから私にとっての解決策は純粋なAppCompatに行くことでした

だから私はAppCompatEditTextTextInputLayoutに追加しています

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);
}

完全なソースコードはこちら

9
Chase Florell

次のようにXfxEntryRendererDroidControlOnFocusChangeメソッドでコードを変更します。

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
    }
    ...
}

効果

2
York Shen

これを使用して、実行時に色合いの色を変更してみませんか(テキスト変更イベントに含まれている可能性があります)。

ViewCompat.SetBackgroundTintList(_YourView , ColorStateList.ValueOf(Color.ParseColor(Resources.GetString(Resource.Color.blueLine))));

とにかくグッドラック!

1
FreakyAli

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>

これを確認してください

これが Link1Link2 お役に立てば幸いです。

0
InsaneCat