Question de mise au point avec plusieurs EditTexts
J'ai une activité avec deux EditText
s. Je suis l'appel de la requestFocus
sur la deuxième EditText
champ, car par défaut, le curseur passe à la première. L'accent semble être dans le deuxième champ (la deuxième, on obtient la surbrillance de la frontière), mais si nous essayons de saisir des caractères en utilisant le clavier matériel le texte apparaît dans la première EditText
de contrôle. Toutes les idées pour lesquelles il serait passe?
Merci de poster votre code afin que nous puissions voir exactement ce que vous faites.
Sans plus d'information, cette question ne peut être répondu, d'une manière raisonnable, et il s'est assis autour d'avec pas d'informations supplémentaires pour un certain temps.
Sans plus d'information, cette question ne peut être répondu, d'une manière raisonnable, et il s'est assis autour d'avec pas d'informations supplémentaires pour un certain temps.
OriginalL'auteur Ashish | 2010-06-09
Vous devez vous connecter pour publier un commentaire.
Il est difficile de dire si c'était votre problème, mais il n'est pas rare.
TL;DR: ne Jamais appeler focus-changement de méthodes comme
requestFocus()
de l'intérieur d'unonFocusChanged()
appel.Le problème réside dans
ViewGroup.requestChildFocus()
, qui contient ceci:À l'intérieur du domaine privé
mFocused
un ViewGroup magasins de la vue enfant qui a actuellement le focus, le cas échéant.Dire que vous avez un ViewGroup
VG
qui contient trois focusable points de vue (par exemple, EditTexts)A
,B
, etC
.Vous avez ajouté un
OnFocusChangeListener
àA
que (peut-être pas directement, mais quelque part imbriquées à l'intérieur) appelsB.requestFocus()
quandA
perd le focus.Maintenant, imaginez que
A
a le focus et que l'utilisateur appuie surC
, provoquantA
à perdre etC
pour obtenir le focus. Parce queVG.mFocused
est actuellementA
, la partie ci-dessus deVG.requestChildFocus(C, C)
se traduit alors par ceci:A.unFocus()
fait deux choses importantes ici:Il marque
A
de ne pas avoir l'accent plus.Il appelle votre attention changement de l'auditeur.
Dans cet écouteur, vous appelez maintenant
B.requestFocus()
. Cela provoqueB
à être marqué comme ayant le focus, puis appelleVG.requestChildFocus(B, B)
. Parce que nous sommes toujours profondément à l'intérieur de l'appeler, j'ai marqué avec(1)
, la valeur demFocused
est encoreA
, et donc cet appel intérieur ressemble à ceci:Cette fois, l'appel à
A.unFocus()
ne rien faire, parce queA
est déjà marqué comme non représentatives (sinon nous aurions une récursivité infinie ici). Aussi, rien ne se passe que des marques deC
comme floue, qui est le point de vue que fait a le focus de la droite maintenant.Vient maintenant
(2)
, qui définitmFocused
àB
. Après quelques plus de choses, nous nous sommes enfin de retour à partir de l'appel à(1)
, et donc à(3)
la valeur demFocused
est maintenantC
, écraser le précédent changement.Alors maintenant, nous aboutissons à une contradiction de l'état.
B
etC
pensons tous les deux qu'ils ont le focus,VG
considèreC
à la porté des enfants.En particulier, les appuis sur les touches retrouver dans
C
, et il est impossible pour l'utilisateur de changer le focusB
, parce queB
pense qu'il a déjà focus et donc de ne pas faire quelque chose sur l'accent des demandes; plus important encore, il ne pas appelVG.requestChildFocus
.Corollaire: vous aussi Vous ne devriez pas compter sur les résultats de
hasFocus()
appels tandis qu'à l'intérieur d'unOnFocusChanged
gestionnaire, parce que les informations de mise au point est incompatible bien que l'intérieur de l'appel.Grande réponse, mais que voulez-vous recommander de contourner ce problème. Il vous suffit de poster un message pour le faire?
Oui, vous devez être à l'extérieur du gestionnaire d'événements, de sorte que c'est vraiment la seule solution je pense.
Sauf si bien sûr ce n'est pas vraiment nécessaire de faire un changement de focus. Dans le cas qui m'a fait remarquer ce problème, j'ai pu éviter les problèmes en ne changeant pas de se concentrer quand il n'était pas strictement nécessaire. Dépend du cas d'utilisation.
La droite. Pour moi, l'utilisateur est en train d'initier un changement de focus avec une presse. Autant que je sache, il n'y a aucun moyen d'empêcher ça. Est que votre compréhension ainsi?
OriginalL'auteur balpha
J'ai trouvé la solution.
À l'intérieur de onFocusChange ne pas appeler directement requestFocus, au lieu de poster un praticable de demander le focus. par exemple, ci-dessous mon code,
pourquoi ne pas créer une question de code montrant ce que vous voulez, alors peut-être je peux vous aider
J'ai réussi à mettre ma demande de se concentrer à l'extérieur de la focusChange gestionnaire de l'omi est le chemin à parcourir. Le problème que j'avais était exactement ce que bl'alpha expliqué, l'obtention de deux editText vues avec les deux ayant le focus. Peut-être que mon problème était de le mettre dans un gestionnaire à la place de l'auditeur, où j'ai eu '((EditText)de l'expéditeur).Post(new Runnable(délégué { ((EditText)de l'expéditeur).RequestFocus(); }));'
OriginalL'auteur Shirish Herwade
J'ai été confrontée au même problème, l'un de mes EditText a un OnFocusListener et quand il perdre le focus-je faire quelques transformations, mais si quelque chose va mal, j'ai essayer de requestFocus de nouveau et de laisser l'utilisateur pour résoudre le problème. Et c'est là que le problème se présente, je me retrouve avec de EditText avec un accent, j'ai essayé de chercher le point de vue avec l'accent mais les findFocus() a retourné null. La seule solution que j'ai trouvé était de créer un EditText variable
Si aucun problème, j'ai mis mon EditText à cette variable et voici ce que je n'aime pas, mais il fonctionne, j'ai mis OnFocusListener à l'autre point de vue sur mon activité. Quand ils obtiennent le focus, j'ai fais ce
J'ai clairement l'accent de la vue qui l'a, je demande de se Concentrer et de définir la variable requestFocus null.
Je crois que ce qui se passe, car à l'époque je demande un Accent nul ne dispose d'un foyer encore, mon EditText retrouver le focus et l'activité donne le focus à la fenêtre suivante. Espérons que cela aide à quelqu'un.
OriginalL'auteur Antonio Cervantes
Essayez d'utiliser requestFocus(); http://developer.android.com/reference/android/view/View.html#requestFocus()
OriginalL'auteur locoboy