6

Is there a way to customize these TextInputLayout properties programmatically:

  • textColorHint
  • colorAccent
  • colorControlNormal
  • colorControlActivated
  • textSelectHandle

I know how to style them using theme attributes, but the project I'm working on loads color information dynamically, and as far as I understand there is no way of changing theme/style values at runtime.

Cœur
  • 37,241
  • 25
  • 195
  • 267
Ognian Gloushkov
  • 2,669
  • 1
  • 20
  • 35
  • You may find the answer here: http://stackoverflow.com/questions/31722034/how-to-change-color-of-textinputlayouts-label-and-edittext-underline-android/31723120#31723120 – guisantogui Oct 28 '16 at 16:24
  • 1
    The question was to set it programatically. – Ryno C. Feb 01 '17 at 08:15

1 Answers1

4

I write textInputLayout implemention, that can set any color of underline and error and show error on top.

enter image description here

enter image description here

enter image description here

public class TextInputLayoutUseful extends TextInputLayout {
private CharSequence originalHint = "";

public TextInputLayoutUseful(Context context) {
    super(context);
    init();
}

public TextInputLayoutUseful(Context context, AttributeSet attrs) {
    super(context, attrs);
    init();
}

public TextInputLayoutUseful(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    init();
}

private void init() {
    this.originalHint = getHint();
    setErrorEnabled(false);
}

/**
 * - put error text into top floating label
 * - colorized layout
 *
 * @param error error text
 */
@Override
public void setError(@Nullable CharSequence error) {
    if (error == null) {
        setHint(originalHint);
        setHintTextAppearance(R.style.InputLayoutNormalHint);
        setUnderlineColor(R.color.input_normal_accent);
    } else {
        setHint(error);
        setHintTextAppearance(R.style.InputLayoutErrorHint);
        setUnderlineColor(R.color.input_error_accent);
    }
}

/**
 * colorized layout specified green color
 *
 * @param acceptedHint text for floating label
 */
public void setGreenError(@NonNull CharSequence acceptedHint) {
    setHint(acceptedHint);
    setHintTextAppearance(R.style.InputLayoutAcceptedHint);
    setUnderlineColor(R.color.input_accepted_accent);
}

private void setUnderlineColor(@ColorRes int colorRes) {
    if (getEditText() != null) {
        getEditText().getBackground().mutate().setColorFilter(ContextCompat.getColor(getContext(), colorRes), PorterDuff.Mode.SRC_ATOP);
    }
}
}

style

<style name="InputLayoutErrorHint" parent="TextAppearance.AppCompat">
    <item name="android:textColor">@color/input_error_accent</item>
</style>

<style name="InputLayoutNormalHint" parent="TextAppearance.AppCompat">
    <item name="android:textColor">@color/input_normal_accent</item>
</style>

<style name="InputLayoutAcceptedHint" parent="TextAppearance.AppCompat">
    <item name="android:textColor">@color/input_accepted_accent</item>
</style>
Gogi Bobina
  • 1,086
  • 1
  • 8
  • 25