web-dev-qa-db-fra.com

EditText setError () avec une icône mais sans message Popup

Je veux avoir une validation pour mon EditText dans lequel je veux montrer "  enter image description here L'icône "(qui apparaît lorsque vous mettez editText.setError("blah blah")) mais que vous ne voulez pas que le texte dans le popup affiche" bla bla ".

Y a-t-il un moyen de le faire? Une solution consiste à créer une mise en page personnalisée qui affichera l'icône de l'image dans le texte d'édition. Mais existe-t-il une meilleure solution?

30
Rajkiran

Problème résolu après de nombreuses recherches et permutations - (également grâce à @van)

Créez une nouvelle classe qui étendra EditText à peu près comme ceci-

public class MyEditText extends EditText {

public MyEditText(Context context, AttributeSet attrs) {
    super(context, attrs);
}

@Override
public void setError(CharSequence error, Drawable icon) {
    setCompoundDrawables(null, null, icon, null);
}
}

Utilisez cette classe comme une vue dans votre XML comme ceci-

<com.raj.poc.MyEditText
    Android:id="@+id/et_test"
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content"/>

Maintenant, dans la troisième étape, définissez simplement une TextWatcher dans votre affichage texte personnalisé comme ceci-

    et = (MyEditText) findViewById(R.id.et_test);

    errorIcon = getResources().getDrawable(R.drawable.ic_error);
    errorIcon.setBounds(new Rect(0, 0, errorIcon.getIntrinsicWidth(), errorIcon.getIntrinsicHeight()));
       et.setError(null,errorIcon);

    et.addTextChangedListener(new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count,
                int after) {
            // TODO Auto-generated method stub

        }

        @Override
        public void afterTextChanged(Editable s) {
            if(s.toString().length()>6){
                et.setError("", null);
            }else{
                et.setError("", errorIcon);
            }
        }
    });

R.drawable.ic_error

Garder le texte null résout le problème Mais si nous gardons uniquement la valeur null dans setError (null), l'erreur de validation ne s'affichera pas; il devrait être nul avec second param.

36
Rajkiran

Vous n'avez pas besoin de créer une nouvelle classe EditText ou de changer xml. La solution est très simple:

Edittext editText= (EditText) rootView.findViewById(R.id.email);

String str= editText.getText().toString();

if(str.equalsIgnoreCase("") ){

                Drawable dr = getResources().getDrawable(R.drawable.error); 
                                 //add an error icon to yur drawable files
                dr.setBounds(0, 0, dr.getIntrinsicWidth(), dr.getIntrinsicHeight());

                editText.setCompoundDrawables(null,null,dr,null);

            }
12
mhmttaa

Désolé, Rajkiran, mais votre solution ne fonctionne pas sur la version Android 4.2. Si j'essaie de définir la valeur null pour l'erreur, elle ne sera même pas affichée. La solution que j'ai trouvée consistait à étendre la méthode EditText et à la remplacer par la méthode setError. Non, je n'ai qu'un indicateur d'erreur sans popup.

@Override
public void setError(CharSequence pError, Drawable pIcon) {
    setCompoundDrawables(null, null, pIcon, null);
}
4
van

J'ai eu le même problème. Je voulais utiliser .setError() dans ma EditText lorsque l'utilisateur insère une entrée nulle. Mais je pense que le message contextuel est ennuyeux, en particulier lorsque vous avez plus de EditTexts… .. Ma solution était naïve et simple, mais elle fonctionnait sur tous les appareils que j'avais essayés jusqu'à présent.

J'ai créé ma propre classe myEditText et juste @Override cette méthode:

    @Override
    public void setError(CharSequence error, Drawable icon) {
       setCompoundDrawables(null, null, icon, null);
    }

puis utilisez dans layout.xml

    <cz.project.myEditText
     ...
    />

et enfin dans mon code Je mets onFocusChangeListener à myEditText, ainsi, lorsque quelqu'un clique dessus, l'icône disparaît.

    myEditText input = (myEditText) findViewById(R.id.input);
    input.setOnFocusChangeListener(new OnFocusChangeListener() {

    @Override
    public void onFocusChange(View v, boolean hasFocus) {
            input.setError(null);
    });

    if(val == null) input.setError("");

Cela fonctionne exactement comme je le veux = pas de message contextuel lorsque .setError() est appelé le EditText.

1
pajus_cz

Faites simplement ce qui suit >>

editText.requestFocus();
editText.setError( "your error message" );

a travaillé pour moi.

0
Sumon Bappi

Pour obtenir uniquement l'icône d'erreur sans message d'erreur popup uniquement lorsque setError("") est appelé (c'est-à-dire définir une chaîne vide en tant que message d'erreur), j'utilise une classe EditText personnalisée dans laquelle je remplace setError(CharSequence, Drawable) comme ceci:

@Override
public void setError(CharSequence error, Drawable icon) {
    if (error == null) {
        super.setError(null, icon);
        setCompoundDrawables(null, null, null, null);
    }
    else if (error.toString().equals("")) setCompoundDrawables(null, null, icon, null);
    else super.setError(error, icon);
}

Tout le reste demeure inchangé:

Utilisez setError(null) pour obtenir ni l'icône ni le message contextuel.

Utilisez setError(errorMessage), où errorMessage est une chaîne de longueur minimale 1 pour obtenir l'icône et le message contextuel.

0
Micha F.