我第一次使用新的Android的小部件TextInputLayout,它非常好但我使用setError方法遇到了一些问题
这是我的xml
怎么了:
我跑的时候
setError("error message")
整个EditText背景和提示文本颜色变为红色,因为这里很好.问题是我跑的时候
setError(null)
EditText的样式与原始样式完全不同.
开始情况:
聚焦 重点
后 setError("mandatory field")
后 setError(null)
我做了很多研究,但找不到任何有用的东西,问题到底是什么?
UPDATE
调查setError()
方法的android源代码我发现了这个
public void setError(@Nullable CharSequence error) { if (!mErrorEnabled) { if (TextUtils.isEmpty(error)) { // If error isn't enabled, and the error is empty, just return return; } // Else, we'll assume that they want to enable the error functionality setErrorEnabled(true); } if (!TextUtils.isEmpty(error)) { ViewCompat.setAlpha(mErrorView, 0f); mErrorView.setText(error); ViewCompat.animate(mErrorView) .alpha(1f) .setDuration(ANIMATION_DURATION) .setInterpolator(AnimationUtils.FAST_OUT_SLOW_IN_INTERPOLATOR) .setListener(new ViewPropertyAnimatorListenerAdapter() { @Override public void onAnimationStart(View view) { view.setVisibility(VISIBLE); } }) .start(); // Set the EditText's background tint to the error color mErrorShown = true; updateEditTextBackground(); updateLabelVisibility(true); } else { if (mErrorView.getVisibility() == VISIBLE) { ViewCompat.animate(mErrorView) .alpha(0f) .setDuration(ANIMATION_DURATION) .setInterpolator(AnimationUtils.FAST_OUT_SLOW_IN_INTERPOLATOR) .setListener(new ViewPropertyAnimatorListenerAdapter() { @Override public void onAnimationEnd(View view) { view.setVisibility(INVISIBLE); updateLabelVisibility(true); } }).start(); // Restore the 'original' tint, using colorControlNormal and colorControlActivated mErrorShown = false; updateEditTextBackground(); } } private void updateEditTextBackground() { if (mErrorShown && mErrorView != null) { // Set the EditText's background tint to the error color ViewCompat.setBackgroundTintList(mEditText, ColorStateList.valueOf(mErrorView.getCurrentTextColor())); } else if (mCounterOverflowed && mCounterView != null) { ViewCompat.setBackgroundTintList(mEditText, ColorStateList.valueOf(mCounterView.getCurrentTextColor())); } else { final TintManager tintManager = TintManager.get(getContext()); ViewCompat.setBackgroundTintList(mEditText, tintManager.getTintList(R.drawable.abc_edit_text_material)); } }
并调试代码我发现执行的代码片段updateEditTextBackground()
如下
final TintManager tintManager = TintManager.get(getContext()); ViewCompat.setBackgroundTintList(mEditText, tintManager.getTintList(R.drawable.abc_edit_text_material));
似乎android是任意取代EditText的背景色调.我尝试使用此代码在名为abc_edit_text_material.xml的drawable文件夹中创建一个文件
但这是之后的结果 setError(null)
此外,我注意到只有当我运行setError("错误消息")然后运行setError(null)时才会出现问题
更新2 这是我用来验证输入的代码
public boolean validateInputs() { mTxtNameWrapper.setError(null); mTxtLastNameWrapper.setError(null); mTxtEmailWrapper.setError(null); mTxtCountryWrapper.setError(null); mTxtIdCardWrapper.setError(null); mTxtFiscalCodeWrapper.setError(null); mLblDocTypeError.setVisibility(View.GONE); if (Strings.isNullOrEmpty(mTxtName.getText().toString())) { mTxtNameWrapper.setError("Mandatory field"); return false; } if (Strings.isNullOrEmpty(mTxtLastName.getText().toString())) { mTxtLastNameWrapper.setError("Mandatory field"); return false; } if (Strings.isNullOrEmpty(mTxtEmail.getText().toString())) { mTxtEmailWrapper.setError("Mandatory field"); return false; } if (!android.util.Patterns.EMAIL_ADDRESS.matcher(mTxtEmail.getText().toString()).matches()) { mTxtEmailWrapper.setError("Invalid email format"); return false; } if (Strings.isNullOrEmpty(mTxtCountry.getText().toString())) { mTxtCountryWrapper.setError("Mandatory field"); return false; } if (mRdgIdType.getCheckedRadioButtonId() == -1) { mLblDocTypeError.setText("Select a document type"); mLblDocTypeError.setVisibility(View.VISIBLE); return false; } if (Strings.isNullOrEmpty(mTxtIdCard.getText().toString())) { mTxtIdCardWrapper.setError("Mandatory field"); return false; } if (Strings.isNullOrEmpty(mTxtFiscalCode.getText().toString())) { mTxtFiscalCodeWrapper.setError("Mandatory field"); return false; } return true; }
我要疯了!!!
我遇到了类似的问题,并找到了一个简单的解决方案.如果我们将自定义背景drawable/color设置为EditText
内部,则会出现此问题TextInputLayout
.对此的解决方案是子类化TextInputLayout
和覆盖setError()
和drawableStateChanged()
方法,并EditText's
再次将我们的自定义drawable/color设置为背景.例如,我的EditText's
背景有一个圆角的drawable set ,下面是我的子类,
public class RoundedBorderedTextInputLayout extends TextInputLayout { private Context context; public RoundedBorderedTextInputLayout(Context context) { super(context); this.context = context; } public RoundedBorderedTextInputLayout(Context context, AttributeSet attrs) { super(context, attrs); this.context = context; } public RoundedBorderedTextInputLayout(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); this.context = context; } @Override protected void drawableStateChanged() { super.drawableStateChanged(); EditText editText = getEditText(); if(editText != null) { editText.setBackground(ContextCompat.getDrawable(this.context, R.drawable.custom_rounded_edittext)); } } @Override public void setError(@Nullable final CharSequence error) { super.setError(error); EditText editText = getEditText(); if(editText != null) { editText.setBackground(ContextCompat.getDrawable(this.context, R.drawable.custom_rounded_edittext)); } } }
然后在xml中使用自定义类,
希望这可以帮助.快乐的Android编码:)