2015-07-19 1 views
1

J'essaie de configurer un système pour valider l'entrée de l'utilisateur, dans ce cas, il suffit de vérifier qu'il y a quelque chose entré par l'utilisateur.Conserver le focus sur Edittext dans le port d'écoute OnFocusChanged

J'ai un Utility class qui vérifie que le EditText a des données.

J'utilise un OnFocusChangeListener qui appelle ensuite la méthode du Utility class.

C'est le code de l'activity:

editText = (EditText) view.findViewById(R.id.editText); 
    editText.setOnFocusChangeListener(new View.OnFocusChangeListener() { 
     @Override public void onFocusChange(View v, boolean hasFocus) { 

      if (!hasFocus) { 
       if (Utility.checkInput(editText) == false) { 
        Toast.makeText(getActivity(), "Enter value!", 
          Toast.LENGTH_SHORT).show(); 
        // TODO.... 
        // Retain focus - do not allow user to move on. 
        // This is where I am lost... 

       } 
      } 
     } 
    }); 

Ceci est le code de l'Utility class:

public class Utility { 
    public static boolean checkInput(EditText editText) { 
     if (editText.getText().length() != 0) { 
      return true; 
     } 
     return false; 
    } 
    //.../ 
  1. Là où je suis perplexe est de savoir comment conserver le focus si l'entrée de contrôle renvoie false. Je veux empêcher l'utilisateur d'avancer. Je suis sûr qu'il existe une solution simple, mais je ne l'ai pas trouvée. Je me demande également si le xmlime.Options affectera ceci.
    Merci.

EDIT

Ceci est mon xml:

<EditText 
    android:imeOptions="actionDone" 
    android:inputType="textPersonName" 
    android:maxLength="24"/> 

<spinner ../ 

<EditText 
    android:imeOptions="actionDone" 
    android:inputType="phone" 
    android:maxLength="12"/> 

Quand j'utilise:

if (!hasFocus) { 
    if (Utility.checkInput(name) == false) { 
     Toast.makeText(AddDriverUserActivity.this, "Enter value!",Toast.LENGTH_SHORT).show(); 
     name.requestFocus(); 
     } 
} 

Le problème est, je me sers de l'action fait (pour cacher la clavier), comme l'utilisateur sélectionne ensuite à partir d'un fileur puis passe à la suivante EditText. Ainsi, le pain ne montre pas jusqu'à ce que je touche le prochain texte d'édition (téléphone) et l'accent est ensuite mis sur deux textes d'édition:

enter image description here

Quand je remis à zéro:

android:imeOptions="actionDone" à actionNext il montre le toast, puis passe à l'édition suivante, comme indiqué dans la capture d'écran, les deux sont concentrés.

Request focus ne l'empêche pas de se déplacer à partir du edittext.

+0

Je vais mettre en œuvre un vérificateur lorsque je soumets tous les domaines, mais il doit y avoir un moyen de le faire étape sage .... hm –

Répondre

1

Utilisez View.requestFocus()

// Retain focus - do not allow user to move on. 
editText.requestFocus(); 
+0

merci Petey je vais aller le tester, je ne savais pas sur requestfocus –

+0

S'il vous plaît voir ma mise à jour. Je devrais reformuler ma question pour trouver une solution plus élégante, car je pense que je suis trop compliqué. –

0

Ce n'est pas une solution à retenir focus dans le EditText pour valider l'entrée, mais il est une façon élégante de vérifier l'entrée d'utilisateur.

J'ajoute tous mes EditText à un array et je les passe à une méthode qui parcourt le tableau et vérifie chaque entrée.

Dans mon Utility class:

public static boolean checkAllInput(EditText[] editTexts) { 
    for (int i = 0; i < editTexts.length; i++) { 
     if (editTexts[i].getText().length() == 0) { 
      return false; 
     } 
    } 
    return true; 
} 

Dans l'activité/fragment:

ajouter les EditTexts à un tableau:

final EditText[] editTexts = {arg1, arg2, arg3, arg4, .../}; 

Ensuite, utilisez la fonction dans mon OnTouchListener pour la button .

addBtn.setOnTouchListener(new View.OnTouchListener() { 
     @Override public boolean onTouch(View v, MotionEvent event) { 
      hideKeyboard(); 
      disableButton(addBtn); 
      if (Utility.checkAllInput(editTexts) == false) { 
       Toast.makeText(getActivity(), "Enter all fields", 
         Toast.LENGTH_SHORT).show(); 
       enableButton(addBtn); 
      } else { 
       // Do something .. 
      } 
      return false; 
     } 
    }); 

Je pensais que cela pourrait être utile pour les autres qui travaillent leur chemin à travers android.

Comme une note de côté, j'ai invalidantes mes boutons, pour éviter des attouchements répétés:
Using countdown to set button enabled