web-dev-qa-db-fra.com

Changer l'arrière-plan du message d'erreur de EditText

Ce que je veux faire, c'est changer la couleur d'arrière-plan (définir un dessin personnalisé) d'un message d'erreur contextuel affiché après avoir utilisé la méthode setError().

Actuellement, cela ressemble à ceci:

enter image description here

J'ai trouvé que Android a deux fichiers:

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

Et vous êtes censé pouvoir les définir à l'aide de deux attributs:

  • errorMessageBackground
  • errorMessageAboveBackground

Mais quand j'essaye de les mettre dans mon thème, tout ce que j'obtiens c'est:

<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'.

(c'est le même with Android:errorMessageBackground)

Je pose cette question ici, car je n'ai plus d'idées - peut-être que quelqu'un a déjà réussi à le faire?

EDIT: En-tête du thème que j'utilise:

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

UNE AUTRE MODIFICATION: Euh, j'ai trouvé que ma question est un doublon de: Android: errorMessageBackground n'obtenant aucune erreur de ressource trouvée dans les styles. xml

ENCORE UNE AUTRE MODIFICATION: C'est un problème connu, jetez un œil à ce lien: https://code.google.com/p/Android/problèmes/détail? Id = 55879

33
scana

Je suggérerais d'utiliser @ solution Codeversed , mais si cela ne vous convient pas pour une raison quelconque, vous pouvez utiliser mon implémentation personnalisée EditText.

Représentation EditText habituelle: enter image description here

EditText avec erreur: enter image description here

En quelques mots: j'ai créé un état xml personnalisé pour l'affichage des erreurs. Voir le code associé ci-dessous:

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;
    }
}

drawable/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>

drawable/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>

ajouter à votre attrs.xml

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

et à styleables.xml

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

et l'utilisation est vraiment simple:

<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"
    />

[ÉDITER]:

Je viens de me rendre compte que la réponse originale consistait à changer la couleur du popup d'erreur, mais pas la couleur d'arrière-plan EditText. Quoi qu'il en soit, j'espère que cela peut aider quelqu'un.

6
Oleksandr

vous devrez inclure ces dépendances:

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

et voici un exemple sur la façon de l'utiliser:

<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>

Cela vous donnera la conception matérielle que vous recherchez pour donner une validation de formulaire ainsi qu'un effet d'animation agréable pour l'étiquette.

enter image description here

5
Codeversed