Изменить фон сообщения об ошибке EditText
То, что я хочу сделать, это изменить цвет фона (установить пользовательский вывод) сообщения об ошибке всплывающего окна, отображаемого после использования метода setError()
.
В настоящее время он выглядит так:
![enter image description here]()
Я обнаружил, что 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
)
Я задаю этот вопрос здесь, потому что у меня закончились идеи - возможно, кто-то уже успел это сделать?
EDIT:
Заголовок темы, которую я использую:
<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
Ответы
Ответ 1
вам нужно будет включить эти зависимости:
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>
Это даст вам Material Design, который вы ищете, чтобы дать подтверждение формы, а также приятный эффект анимации для метки.
![введите описание изображения здесь]()
Ответ 2
Я бы предложил использовать @Codeversed решение, но если это по какой-то причине вам не подходит, вы можете использовать мою собственную реализацию EditText
.
Обычное представление EditText:
![введите описание изображения здесь]()
EditText с ошибкой:
![введите описание изображения здесь]()
В нескольких словах: я создал пользовательское состояние 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"
/>
[EDIT]:
Только что понял, что первоначальный ответ заключался в изменении цвета всплывающего окна, но не на цвет фона EditText. В любом случае, надеюсь, что это может помочь кому-то.
Ответ 3
private EditText adTitle;
// ....
adTitle.setError(Html.fromHtml("<font color='red'>hello</font>"));
Ответ 4
Вы можете использовать этот метод, просто передайте текст 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);
}