EditText setError () avec icône mais sans message contextuel
Je veux avoir une validation pour mon EditText dans lequel je veux montrer "" 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?
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);
}
}
});
Où 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.
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);
}
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);
}
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 EditText
S.
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
.
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.
Faites simplement ce qui suit > >
editText.requestFocus();
editText.setError( "your error message" );
Travaillé pour moi.
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