web-dev-qa-db-fra.com

Comment afficher les erreurs de saisie en popup?

Je veux afficher toutes mes erreurs de validation des champs EdiText dans une fenêtre contextuelle comme indiqué dans l'image ci-dessous:

Error alert in popup

Pour autant que je sache Android a des drawables:

1) popup_inline_error.9.png

popup_inline_error.9.png

2) popup_inline_error_above.9.png

popup_inline_error_above.9

3) indicator_input_error.png

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é.

61
Vikas Patidar

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;
            }
        });
34
SBK

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.

Drawable par défaut

Default Drawable

Drawable personnalisé

Custom Drawable

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.

main.xml

<?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>

EditTextValidator.Java

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:

Empty textEmpty text

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:

Wrong username

2) Je tape le texte Password1 Dans le champ du mot de passe, puis l'erreur sera comme indiqué dans l'image ci-dessous:

wrong password

Remarque:

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().

38
Vikas Patidar

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.

  1. 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>
    
  2. 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"
        >
    
1
Shardul