Comment afficher les erreurs d'entrée dans popup?

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

Alerte d'erreur dans la fenêtre contextuelle

Pour autant que je sache Android a 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 suis en mesure d'afficher l'indicateur d'erreur rouge à l'intérieur du côté droit de la EditText par utilisation:

Drawable err_indiactor = getResources().getDrawable(R.drawable.indicator_input_error);
mEdiText.setCompoundDrawablesWithIntrinsicBounds(null, null, err_indiactor, null);

Maintenant, je veux aussi 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
demandé sur mmBs 2011-03-07 13:46:26

3 réponses

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;
            }
        });
34
répondu SBK 2011-03-07 12:52:24

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 dessinable personnalisée au lieu de l'image par défaut indicator_input_error.

Dessinable Par Défaut

Dessinable Par Défaut

Dessinable Personnalisé

Dessinable Personnalisé

Donc, je viens de créer deux EditText dans mon fichier xml de mise en page, puis j'ai implémenté un Listener dans le code Java sur ce EditText.

Principal.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 de cliquer sur le Username champ Softkeybord ouvre et si l'utilisateur appuyez sur Next clé ensuite, l'utilisateur sera porté à la Password champ et Username champ reste vide, alors l'erreur sera affiché comme donné dans les images ci-dessous:

Texte videTexte vide

Pour les validations d'entrée incorrectes:

1) je tape le texte vikaS dans le champ Nom D'utilisateur alors l'erreur sera comme donnée dans l'image ci-dessous :

Mauvais nom d'utilisateur

2) je tape le texte Password1 dans le champ Mot de passe alors l'erreur sera comme donnée dans l'image ci-dessous:

mauvais mot de passe

Remarque:

Ici, j'ai utilisé custom drawable uniquement dans le cas où l'Utilisateur a laissé le champ EditText vide et appuyez sur la touche suivante sur le clavier, mais vous pouvez l'utiliser dans tous les cas. Seulement vous devez fournir l'objet Drawable dans la méthode setError().

38
répondu Vikas Patidar 2011-03-08 13:08:33

Je sais que la réponse a été acceptée par le demandeur, mais aucun de ce qui précède n'a fonctionné pour moi.

J'ai pu reproduire ceci sur mon Nexus S fonctionnant 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é de manifeste.

        <application
             android:name=".MyApp"
             android:icon="@drawable/ic_launcher"
             android:label="@string/app_name" 
             android:theme="@style/MyApp.Theme.Light.NoTitleBar"
        >
    
1
répondu Shardul 2012-02-25 18:33:32