2011-07-03 3 views
0

Je suis resté avec le problème suivant: Je dois valider, que la valeur de EditText est un entier entre 1 et 1000. Si ce n'est pas - je devrais mettre une partie de la valeur par défaut dans le EditText. Lorsque j'essaie de faire une chose avec le code suivant - j'arrive à la boucle infinie (enfin, c'était prévisible). J'ai vérifié les questions similaires, mais je n'arrive toujours pas à comprendre comment faire fonctionner le code.
Existe-t-il d'autres moyens de mettre en œuvre le comportement souhaité? Comment je devrais éditer mon code pour y parvenir?
Valider EditerTexte

Long mailIntervalValue; 
    EditText etMailInterval; 
     . 
     . 
     . 
     . 
    etMailInterval=(EditText)findViewById(R.id.et_mail_check_interval); 
    etMailInterval.setText(mailIntervalValue.toString()); 
    etMailInterval.addTextChangedListener(new TextWatcher(){ 
     public void afterTextChanged(Editable s) { 
      Integer t=Integer.getInteger(s.toString()); 
      if (t==null){ 
       s.clear(); 
       s.append(mailIntervalValue.toString()); 
       mailIntervalValue=MessageManager.DEFAULT_TIME; 
      } 
      else 
       mailIntervalValue=t.longValue(); 
      if (mailIntervalValue<1 || mailIntervalValue>1000){ 
       if (mailIntervalValue<1) 
        mailIntervalValue=1L; 
       else 
        mailIntervalValue=1000L; 
       s.clear(); 
       s.append(mailIntervalValue.toString()); 
       Toast.makeText(MainActivity.this, MainActivity.this.getString(R.string.settings_timer_fail), 
         Toast.LENGTH_SHORT).show(); 
      } 

      saveMailerPrefs(); 
     } 
     public void beforeTextChanged(CharSequence s, int start, int count, int after){} 
     public void onTextChanged(CharSequence s, int start, int before, int count){} 
    }); 

Répondre

1

Je suggère d'utiliser l'outil prévu pour le travail: un input filter pourrait être une meilleure alternative.

Voici quelques example code et certains documentation. Si vous avez besoin de quelque chose de plus complexe, je vous recommande de regarder this code.

+0

Merci, je pense que c'est ce dont j'avais besoin. – Dirol

+0

Bienvenue. J'espère que ça marche pour toi. –

0

Avez-vous remarqué que TextWatcher s'appelle? Je pense que ce serait une meilleure approche pour vérifier la validation avec tout autre événement, par ex. En appuyant sur Entrée ou avec un bouton etc.

+0

Bien sûr, je l'ai remarqué) Et la question est - comment je peux l'éviter et encore obtenir les résultats. OnEnter, ou tout autre appui sur un bouton n'est pas approprié pour ce cas, car l'utilisateur peut cliquer sur le bouton - qui le sort de cette mise en page - afin qu'il ne puisse pas voir que le programme l'a corrigé. (Eh bien, il peut le voir par le Toast, mais il y a encore une autre disposition devant lui en ce moment, ce qui n'est pas si facile à utiliser) – Dirol

0

Vous pouvez utiliser z-validations library pour votre cas, il y a la validation InRange - c'est exactement ce dont vous avez besoin. Exemple de code en utilisant la bibliothèque:

//create validation form 
Form form = new Form(mActivity); 
form.addField(Field.using(mYourEditText).validate(InRange.build(mContext, minAllowed, maxAllowed))); 

//validate form 

if (form.isValid()) { 
    Toast.makeText(this, "Form is valid", Toast.LENGTH_SHORT).show(); 
} 

En savoir plus sur EditText validation et cette bibliothèque, vous pouvez lire en post: Android form validation - the right way