EditText setError () avec icône mais sans message contextuel

Je veux avoir une validation pour mon EditText dans lequel je veux montrer "entrez la description de l'image ici" icône (qui vient quand vous mettez editText.setError("blah blah")) mais ne voulez pas que le texte dans la fenêtre contextuelle affiche ce "bla bla".

Y a-t-il un moyen de le faire? Une façon est de créer une mise en page personnalisée qui affichera l'icône de l'image dans le EditText. Mais y a-t-il une meilleure solution?

29
demandé sur Gaurav Dave 2012-01-24 14:34:06

7 réponses

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

Créez une nouvelle classe qui va étendre EditText quelque chose 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 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, il suffit de définir un TextWatcher à votre vue de 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 ne conservons que null dans setError (null), cela ne montrera pas l'erreur de validation; il devrait être null avec le deuxième paramètre.

35
répondu Rajkiran 2014-05-15 11:17:00

Vous n'avez pas besoin de créer une nouvelle classe EditText ou de modifier 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);

            }
10
répondu mhmttaa 2014-09-05 14:28:39

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 n'est même pas affichée. La solution que j'ai trouvée était d'étendre EditText et de remplacer la méthode setError. Non, Je n'ai que l'indicateur d'erreur sans popup.

@Override
public void setError(CharSequence pError, Drawable pIcon) {
    setCompoundDrawables(null, null, pIcon, null);
}
4
répondu van 2013-03-04 13:08:43

J'ai eu affaire au même problème. Je voulais utiliser .setError() à mon EditText lorsque l'utilisateur insère une entrée null. Mais je pense que le message pop-out est ennuyeux, surtout quand vous avez plus de EditTextS. Ma solution était naïve et simple, mais elle a fonctionné sur tous les appareils que j'ai 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 utiliser dans layout.xml

    <cz.project.myEditText
     ...
    />

Et enfin dans mon code Je mets onFocusChangeListener à myEditText, donc quand quelqu'un clique sur-in, l'icône disparaître.

    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 veux = aucun message pop-up lorsque .setError() est appelé sur EditText.

1
répondu pajus_cz 2013-09-02 20:31:07

Pour obtenir seulement l'erreur-icône sans message d'erreur-popup seulement lorsque setError("") est (c'est à dire définir une Chaîne vide comme message d'erreur) j'ai utiliser un EditText de classe où 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 reste le même:

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

Utiliser setError(errorMessage), où errorMessage est une Chaîne de longueur 1 au moins, pour obtenir l'icône et le message-popup.

0
répondu Micha F. 2017-06-20 23:06:24

Faites simplement ce qui suit > >

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

Travaillé pour moi.

0
répondu Sumon Bappi 2018-04-04 05:09:33

Ceci est très utile lorsque vous souhaitez afficher les messages d'erreur pour l'edittext champ lorsque l'utilisateur d'entrer des informations erronées.c'est très simplement un programme que vous devez utiliser la méthode serError() dans edittext.

Étape 1: Créer le bouton et implémenter onclickListener.

btnLogin.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
}
});

Étape 2: Validez les champs de saisie et définissez l'erreur dans le champ de saisie.

if(edName.length()>3){
if(edNumber.length()>3){
Toast.makeText(getApplicationContext(), "Login success", Toast.LENGTH_SHORT).show();
}else{
edNumber.setError("Number Mininum length is 4");
}
}else{
edName.setError("Name Mininum length is 4");
}

Référez-vous à ce lien pour more:http://velmuruganandroidcoding.blogspot.in/2014/08/set-error-message-in-edittext-android.html

-2
répondu user3921740 2014-09-05 18:08:00