Je veux afficher toutes mes erreurs de validation des champs EdiText
dans une fenêtre contextuelle comme indiqué dans l'image ci-dessous:
Pour autant que je sache Android a des drawables:
1) popup_inline_error.9.png
2) popup_inline_error_above.9.png
3) indicator_input_error.png
Je peux afficher l'indicateur d'erreur rouge à l'intérieur du côté droit du EditText
en utilisant:
Drawable err_indiactor = getResources().getDrawable(R.drawable.indicator_input_error);
mEdiText.setCompoundDrawablesWithIntrinsicBounds(null, null, err_indiactor, null);
Maintenant, je veux également afficher le message d'erreur comme indiqué est la première image, mais il semble que je n'ai aucune idée à ce sujet, bien que je pense que ce devrait être un toast personnalisé.
essaye ça..
final EditText editText=(EditText) findViewById(R.id.edit);
editText.setImeActionLabel("",EditorInfo.IME_ACTION_NEXT);
editText.setOnEditorActionListener(new OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if(actionId==EditorInfo.IME_ACTION_NEXT){
if( editText.getText().toString().trim().equalsIgnoreCase(""))
editText.setError("Please enter some thing!!!");
else
Toast.makeText(getApplicationContext(),"Notnull",Toast.LENGTH_SHORT).show();
}
return false;
}
});
Comme la réponse précédente est une solution à mon problème, mais j'ai essayé une approche différente pour utiliser une image Drawable personnalisée au lieu de l'image par défaut indicator_input_error
.
Donc, je viens de créer deux EditText
dans mon fichier xml de mise en page, puis j'ai implémenté un Listener
dans Java sur ce EditText
.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:orientation="vertical" Android:layout_width="fill_parent"
Android:layout_height="fill_parent" Android:padding="20dip"
Android:background="#222222">
<EditText Android:layout_width="match_parent"
Android:layout_height="wrap_content" Android:hint="Username"
Android:id="@+id/etUsername" Android:singleLine="true"
Android:imeActionLabel="Next"></EditText>
<EditText Android:layout_width="match_parent"
Android:inputType="textPassword"
Android:layout_height="wrap_content" Android:hint="Password"
Android:id="@+id/etPassword" Android:singleLine="true"
Android:imeActionLabel="Next"></EditText>
</LinearLayout>
import Java.util.regex.Pattern;
import Android.app.Activity;
import Android.graphics.Rect;
import Android.graphics.drawable.Drawable;
import Android.os.Bundle;
import Android.text.Editable;
import Android.text.TextWatcher;
import Android.view.KeyEvent;
import Android.view.inputmethod.EditorInfo;
import Android.widget.EditText;
import Android.widget.TextView;
import Android.widget.TextView.OnEditorActionListener;
public class EditTextValidator extends Activity {
private EditText mUsername, mPassword;
private Drawable error_indicator;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// Setting custom drawable instead of red error indicator,
error_indicator = getResources().getDrawable(R.drawable.Emo_im_yelling);
int left = 0;
int top = 0;
int right = error_indicator.getIntrinsicHeight();
int bottom = error_indicator.getIntrinsicWidth();
error_indicator.setBounds(new Rect(left, top, right, bottom));
mUsername = (EditText) findViewById(R.id.etUsername);
mPassword = (EditText) findViewById(R.id.etPassword);
// Called when user type in EditText
mUsername.addTextChangedListener(new InputValidator(mUsername));
mPassword.addTextChangedListener(new InputValidator(mPassword));
// Called when an action is performed on the EditText
mUsername.setOnEditorActionListener(new EmptyTextListener(mUsername));
mPassword.setOnEditorActionListener(new EmptyTextListener(mPassword));
}
private class InputValidator implements TextWatcher {
private EditText et;
private InputValidator(EditText editText) {
this.et = editText;
}
@Override
public void afterTextChanged(Editable s) {
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before,
int count) {
if (s.length() != 0) {
switch (et.getId()) {
case R.id.etUsername: {
if (!Pattern.matches("^[a-z]{1,16}$", s)) {
et.setError("Oops! Username must have only a-z");
}
}
break;
case R.id.etPassword: {
if (!Pattern.matches("^[a-zA-Z]{1,16}$", s)) {
et.setError("Oops! Password must have only a-z and A-Z");
}
}
break;
}
}
}
}
private class EmptyTextListener implements OnEditorActionListener {
private EditText et;
public EmptyTextListener(EditText editText) {
this.et = editText;
}
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if (actionId == EditorInfo.IME_ACTION_NEXT) {
// Called when user press Next button on the soft keyboard
if (et.getText().toString().equals(""))
et.setError("Oops! empty.", error_indicator);
}
return false;
}
}
}
Maintenant, je l'ai testé comme:
Pour les validations EditText vides:
Supposons que l'utilisateur clique sur le champ Username
puis Softkeybord s'ouvre et si l'utilisateur appuie sur la touche Next
, l'utilisateur se concentrera sur le champ Password
et le champ Username
restera vide, l'erreur sera affichée comme indiqué dans les images ci-dessous:
Pour les validations d'entrée incorrectes:
1) Je tape le texte vikaS
dans le champ Nom d'utilisateur, puis l'erreur sera comme indiqué dans l'image ci-dessous:
2) Je tape le texte Password1
Dans le champ du mot de passe, puis l'erreur sera comme indiqué dans l'image ci-dessous:
Ici, j'ai utilisé un dessin personnalisé uniquement lorsque l'utilisateur a laissé le champ EditText vide et appuyez sur la touche Suivant du clavier, mais vous pouvez l'utiliser dans tous les cas. Vous devez uniquement fournir l'objet Drawable
dans la méthode setError()
.
Je sais que la réponse a été acceptée par le demandeur, mais aucune des réponses ci-dessus n'a fonctionné pour moi.
J'ai pu le reproduire sur mon Nexus S exécutant Android 4.0.3.
Voici comment je l'ai fait fonctionner.
Créez un thème avec:
<style name="MyApp.Theme.Light.NoTitleBar" parent="@Android:style/Theme.Light.NoTitleBar">
<item name="Android:textColorPrimaryInverse">@Android:color/primary_text_light
</item>
</style>
Appliquer MyApp.Theme.Light.NoTitleBar
le thème de mon application/activité à partir du manifeste.
<application
Android:name=".MyApp"
Android:icon="@drawable/ic_launcher"
Android:label="@string/app_name"
Android:theme="@style/MyApp.Theme.Light.NoTitleBar"
>