更改EditText的错误消息的背景

我想要做的是改变使用setError()方法后显示的popup错误消息的背景颜色(设置自定义可绘制)。

目前看起来像这样:

在这里输入图像说明

我发现Android有两个文件:

  • popup_inline_error.9.png
  • popup_inline_above_error.9.png

而且你应该能够使用两个属性来设置它们:

  • errorMessageBackground
  • errorMessageAboveBackground

但是当我尝试将它们放在我的主题中时,我所得到的只是:

 <item name="errorMessageBackground">@drawable/popup_inline_error_holo_light</item> <item name="errorMessageAboveBackground">@drawable/popup_inline_error_above_holo_light</item> error: Error: No resource found that matches the given name: attr 'errorMessageBackground'. 

(这with android:errorMessageBackground相同)

我在这里提出这个问题,因为我已经用尽了想法 – 也许有人已经设法做到这一点?

编辑:我正在使用的主题的标题:

 <resources xmlns:android="http://schemas.android.com/apk/res/android"> <style name="Theme.MyThemeName" parent="@style/Theme.Sherlock.Light"> 

另外编辑:呃,我发现我的问题是重复的: android:errorMessageBackground获取没有资源发现错误styles.xml

还有一个编辑:这是一个已知的问题,看看这个链接: https : //code.google.com/p/android/issues/detail?id = 55879

Solutions Collecting From Web of "更改EditText的错误消息的背景"

您将需要包括这些依赖关系:

 compile 'com.android.support:appcompat-v7:23.1.1' compile 'com.android.support:design:23.1.1' 

这里是一个如何使用它的例子:

 <android.support.design.widget.TextInputLayout android:id="@+id/input_layout_password" android:layout_width="match_parent" android:layout_height="wrap_content"> <EditText android:id="@+id/input_password" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="@string/hint_email" /> </android.support.design.widget.TextInputLayout> 

这将给你你正在寻找的材料devise给表单validation以及一个不错的animation效果的标签。

在这里输入图像说明

我会build议使用@Codeversed解决scheme ,但如果由于某种原因不适合你,你可以使用我自定义的EditText实现。

通常的EditText表示forms: 在这里输入图像说明

有错误的EditText: 在这里输入图像说明

简而言之:我已经为错误显示创build了自定义的xml状态。 看下面的相关代码:

InputEditText.java:

 import android.annotation.TargetApi; import android.content.Context; import android.graphics.drawable.Drawable; import android.os.Build; import android.text.Editable; import android.text.TextWatcher; import android.util.AttributeSet; import android.widget.EditText; import com.example.oleksandr.inputedittext.R; /** * Input EditText which allows define custom drawable for error state */ public class InputEditText extends EditText { private static final int[] STATE_ERROR = {R.attr.state_error}; private boolean mIsError = false; public InputEditText(Context context) { this(context, null, 0); init(); } public InputEditText(Context context, AttributeSet attrs) { super(context, attrs); init(); } public InputEditText(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } @TargetApi(Build.VERSION_CODES.LOLLIPOP) public InputEditText(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); init(); } private void init() { addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { // empty } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { setError(null); } @Override public void afterTextChanged(Editable s) { // empty } }); } @Override public void setError(CharSequence error) { mIsError = error != null; super.setError(error); refreshDrawableState(); } @Override public void setError(CharSequence error, Drawable icon) { mIsError = error != null; super.setError(error, icon); refreshDrawableState(); } @Override protected int[] onCreateDrawableState(int extraSpace) { final int[] drawableState = super.onCreateDrawableState(extraSpace + 1); if (mIsError) { mergeDrawableStates(drawableState, STATE_ERROR); } return drawableState; } } 

绘制/ edittext_bg_error.xml

 <?xml version="1.0" encoding="utf-8"?> <shape android:id="@+id/listview_background_shape" xmlns:android="http://schemas.android.com/apk/res/android" > <stroke android:width="2dp" android:color="#f00" /> <padding android:bottom="2dp" android:left="2dp" android:right="2dp" android:top="2dp" /> <corners android:radius="5dp"/> <solid android:color="#ffffffff"/> </shape> 

绘制/ edittext_bg_selector.xml

 <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <!-- custom error state drawable --> <item android:drawable="@drawable/edittext_bg_error" app:state_error="true"/> <!-- Do whatever you want for all other states --> <item android:drawable="@android:drawable/editbox_background_normal"/> </selector> 

添加到你的attrs.xml

 <attr name="errorColor" format="reference"/> 

styleables.xml

 <?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="error"> <attr name="state_error" format="boolean"/> </declare-styleable> </resources> 

用法很简单:

 <com.example.oleksandr.inputedittext.views.InputEditText android:id="@id/edittext" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/edittext_bg_selector" android:inputType="text" android:text="@string/hello_world" /> 

[编辑]:

刚刚意识到,原来的答案是关于更改错误popup颜色,而不是EditText背景颜色。 无论如何,希望这可以帮助别人。

 private EditText adTitle; // .... adTitle.setError(Html.fromHtml("<font color='red'>hello</font>")); 

你可以使用这个方法只传递msg文本,你的edittext id

  public static void setErrorMsg(String msg,EditText viewId) { //Osama ibrahim 10/5/2013 int ecolor = Color.WHITE; // whatever color you want String estring = msg; ForegroundColorSpan fgcspan = new ForegroundColorSpan(ecolor); SpannableStringBuilder ssbuilder = new SpannableStringBuilder(estring); ssbuilder.setSpan(fgcspan, 0, estring.length(), 0); viewId.setError(ssbuilder); }