- , , setError() on TextInputLayout, , 25.4.0. , .
public class HackedTextInputLayout extends TextInputLayout {
private int forceExpandedHintBlockFlags = 0;
@Override
public void addView(View child, int index, ViewGroup.LayoutParams params) {
super.addView(child, index, params);
if (child instanceof EditText) {
((EditText) child).addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (!TextUtils.isEmpty(getError()) && TextUtils.isEmpty(s)) {
forceExpandedHintBlockFlags++;
}
}
@Override
public void afterTextChanged(Editable s) {
if (!TextUtils.isEmpty(getError()) && TextUtils.isEmpty(s)) {
forceExpandedHintBlockFlags--;
}
}
});
}
}
@Override
public void setError(@Nullable CharSequence error) {
forceExpandedHintBlockFlags++;
super.setError(error);
forceExpandedHintBlockFlags--;
}
@Nullable
@Override
public CharSequence getError() {
return forceExpandedHintBlockFlags > 0 ? null : super.getError();
}
@Override
public void setHintTextAppearance(int resId) {
forceExpandedHintBlockFlags++;
super.setHintTextAppearance(resId);
forceExpandedHintBlockFlags--;
}
@Override
protected void drawableStateChanged() {
forceExpandedHintBlockFlags++;
super.drawableStateChanged();
forceExpandedHintBlockFlags--;
}
}
TextInputLayout. setError(), TextWatcher updateLabelState(), :
if (hasText || this.isEnabled() && (isFocused || isErrorShowing)) {
if (force || this.mHintExpanded) {
this.collapseHint(animate);
}
} ...
isErrorShowing = !TextUtils.isEmpty(this.getError()). , getError(), isErrorShowing == false . Voila:)