61 votes

Comment afficher les erreurs de saisie dans une popup ?

Je veux montrer toutes mes erreurs de validation de EdiText dans une fenêtre popup comme indiqué dans l'image ci-dessous :

Error alert in popup

D'après ce que je sais, Android dispose d'un système de tirage au sort :

1) popup_inline_error.9.png

popup_inline_error.9.png

2) popup_inline_error_above.9.png

popup_inline_error_above.9

3) indicateur_input_error.png

indicator_input_error.png

Je suis en mesure d'afficher l'indicateur d'erreur rouge dans la partie droite de l'écran. 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é dans la première image, mais il semble que je n'obtienne aucune idée à ce sujet, bien que je pense qu'il devrait être un Toast personnalisé.

38voto

Vikas Patidar Points 19772

Comme la réponse précédente est la solution à mon problème, 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 image.

Dessinable par défaut

Default Drawable

Dessinable personnalisé

Custom Drawable

Donc, je viens de créer deux EditText dans mon fichier xml de mise en page, puis j'ai implémenté quelques Listener en code 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 d'EditText vides :

Supposons que l'utilisateur clique sur le Username alors Softkeybord s'ouvre et si l'utilisateur appuie sur Next l'utilisateur sera dirigé vers la page Password et Username reste vide, l'erreur sera affichée comme indiqué dans les images ci-dessous :

Empty textEmpty text

Pour les validations d'entrée erronées :

1) Je tape le texte vikaS dans le champ Username, alors 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 alors l'erreur sera comme donnée dans l'image ci-dessous :

wrong password

Note :

Ici, j'ai utilisé le dessinable personnalisé uniquement dans le cas où l'utilisateur a laissé le champ EditText vide et a appuyé sur la touche Next du clavier, mais vous pouvez l'utiliser dans n'importe quel cas. Vous devez seulement fournir Drawable objet dans setError() méthode.

34voto

SBK Points 885

Essayez ceci

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

1voto

Shardul Points 10371

Je sais que la réponse a été acceptée par l'auteur de la demande, mais aucune des solutions ci-dessus n'a fonctionné pour moi.

J'ai pu reproduire ce problème sur mon Nexus S sous 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 thème à 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"
        >

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X