Je veux avoir une validation pour mon EditText dans lequel je veux montrer " 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?
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);
}
}
});
où 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.
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);
}
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);
}
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 EditText
s… .. 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
.
Faites simplement ce qui suit >>
editText.requestFocus();
editText.setError( "your error message" );
a travaillé pour moi.
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.