2011-04-05 1 views
6

Je dois faire un EditText qui n'accepterait qu'un caractère et un seul caractère (lettre/alpha). Et si l'utilisateur entre un autre caractère, il devrait remplacer celui existant (comme la méthode d'écrasement de la saisie de texte avec 1 symbole autorisé).Permettre seulement 1 caractère dans EditText et toujours remplacer lorsque l'utilisateur l'entrée

  1. Je sais comment définir la longueur maximale du texte dans les propriétés. Mais si je le mets à 1, aucun autre caractère ne peut être inséré avant que l'utilisateur n'en supprime un existant. Mais je veux remplacer char existant avec ce nouveau entré automatiquement sans suppression manuelle. Comment faire ça?

  2. Je sais comment définir la propriété pour autoriser uniquement les chiffres dans un EditText, mais I ne peut pas comprendre comment autoriser uniquement les caractères. Donc, la deuxième question est de savoir comment autoriser uniquement les caractères dans EditText?

Actuellement, je suis en utilisant un EditText avec la taille du texte max = 2 avec le code suivant:

final EditText editLetter = (EditText)findViewById(R.id.editHouseLetter); 
editLetter.addTextChangedListener(new TextWatcher() { 

    public void afterTextChanged(Editable s) { 
     if (s!=null && s.length()>1){ 
      editLetter.setText(s.subSequence(1, s.length())); 
      editLetter.setSelection(1); 
     } 
    } 

    public void beforeTextChanged(CharSequence s, int start, int count, 
     int after) { 

    } 

    public void onTextChanged(CharSequence s, int start, int before, 
     int count) { 

    } 
}); 

Le point est, lorsqu'un utilisateur entre dans un second char, le premier doit être supprimé . La taille du texte à 2 permet à l'utilisateur d'entrer un autre caractère après que celui-ci a déjà été entré. Je ne comprends pas vraiment comment ça marche mais ça le fait :). Et en plus je devais pointer le curseur dans EditText à la dernière position car il va toujours au début qui rend impossible d'entrer quoi que ce soit. Je n'ai pas compris pourquoi est-ce non plus.

Le point principal de cette solution est qu'elle a une taille de 2 caractères EditText, mais je le veux 1-char taille. Et cela permet d'entrer autre chose que les lettres (caractères/alpha) et je ne veux rien d'autre que des caractères.

En utilisant les conseils fournis par sgarman et Character.isLetter() fonction, méthode afterTextChanged regarde cette façon maintenant:

public void afterTextChanged(Editable s) { 
    int iLen=s.length(); 
    if (iLen>0 && !Character.isLetter((s.charAt(iLen-1)))){ 
     s.delete(iLen-1, iLen); 
     return; 
    } 
    if (iLen>1){ 
     s.delete(0, 1); 
    } 
} 

J'ai découvert que l'utilisation Selection.setSelection n'est pas nécessaire dans ce cas. Maintenant, il a un filtre permettant l'entrée de lettres seulement. C'est presque la réponse que je veux. La seule chose qui reste est de savoir comment faire la même chose avec 1 symbole de taille EditText?

Répondre

3

Essayez:

s.delete(0, 1); 
Selection.setSelection(s, s.length()); 
+0

avec la longueur du texte = 2 il fait exactement la même chose. avec la longueur = 1 ça ne marche pas du tout. C'est juste une manière alternative sans utiliser un lien vers ET (editLetter). Merci pour le conseil mais ce n'est pas la réponse. – Stan

+0

@Stan pourquoi avez-vous l'accepter alors ;-) –

+0

S'il vous plaît lire ma question complètement et vous trouverez pourquoi. – Stan

9

Vous pouvez ajouter cette ligne unique à votre mise en page fichier xml, et Android va faire les choses pour vous

android:maxLength="1" 

pour que vous devez l'ajouter comme une propriété à le editText elemet, par exemple

<EditText 
    android:id="@+id/editText1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:inputType="text" 
    android:maxLength="1" > 

J'ai fait face au même problème et j'ai trouvé que cette solution plus facile, je sais c'est une vieille question, mais j'ai décidé de mettre ma réponse pour la rendre plus facile pour ceux qui ouvrent ce lien.

Et je ne devrais pas oublier de remercier le propriétaire de ce blog, dont j'ai cité la réponse!

+5

S'il vous plaît lire ma question plus attentivement - ce n'est pas sur la limite de 1 seul caractère. Votre chemin ne fonctionnera pas. – Stan

2

Je voulais faire la même chose et j'ai utilisé votre code dans afterTextChanged (Editable s) et aussi mis un filtre sur le editText comme ceci.

editText.setFilters(new InputFilter[] {new InputFilter.LengthFilter(2)}); 

Cela a fonctionné comme nous le voulions.

Questions connexes