Ma mise en page contient ListView
, SurfaceView
et EditText
. Lorsque je clique sur EditText
, il reçoit le focus et le clavier à l'écran apparaît. Lorsque je clique quelque part en dehors de EditText
, il a toujours le focus (il ne devrait pas). Je suppose que je pourrais mettre en place OnTouchListener
les autres vues de la mise en page et effacer manuellement le EditText
focus du. Mais semble trop hackish ...
J'ai également la même situation dans l 'autre vue de mise en page - liste avec différents types d' éléments, dont certains ont à l EditText
'intérieur. Ils agissent comme je l'ai écrit ci-dessus.
La tâche est de faire EditText
perdre le focus lorsque l'utilisateur touche quelque chose en dehors.
J'ai vu des questions similaires ici, mais je n'ai trouvé aucune solution ...
la source
hideSoftInputFromWindow()
Sur la base de la réponse de Ken, voici la solution de copier-coller la plus modulaire.
Aucun XML nécessaire.
Mettez-le dans votre activité et il s'appliquera à tous les EditTexts, y compris ceux contenus dans les fragments de cette activité.
la source
MotionEvent.ACTION_DOWN
àMotionEvent.ACTION_UP
votre code. Excellente réponse d'ailleurs!Pour la vue parente de EditText, laissez les 3 attributs suivants être " vrais ":
cliquable , focusable , focusableInTouchMode .
Si une vue souhaite recevoir le focus, elle doit remplir ces 3 conditions.
Voir android.view :
J'espère que ça aide.
la source
(clickable) *OR* (focusable *AND* focusableInTouchMode)
;)Mettez simplement ces propriétés dans le premier parent le plus élevé.
la source
La réponse de Ken fonctionne, mais elle est piratée. Comme pcans fait allusion dans le commentaire de la réponse, la même chose pourrait être faite avec dispatchTouchEvent. Cette solution est plus propre car elle évite d'avoir à pirater le XML avec un FrameLayout transparent et factice. Voici à quoi cela ressemble:
la source
Pour moi, ci-dessous, les choses ont fonctionné -
1. Ajout
android:clickable="true"
etandroid:focusableInTouchMode="true"
auparentLayout
ofEditText
ieandroid.support.design.widget.TextInputLayout
2. Remplacement
dispatchTouchEvent
dans la classe d'activité ethideKeyboard()
fonction d' insertion3. Ajout
setOnFocusChangeListener
pour EditTextla source
Vous avez probablement déjà trouvé la réponse à ce problème, mais j'ai cherché comment le résoudre et je ne peux toujours pas vraiment trouver exactement ce que je cherchais, alors j'ai pensé que je le publierais ici.
Ce que j'ai fait était ce qui suit (c'est très général, le but est de vous donner une idée de la façon de procéder, copier et coller tout le code ne fonctionnera pas O: D):
Tout d'abord, le EditText et toutes les autres vues que vous souhaitez dans votre programme sont enveloppés par une seule vue. Dans mon cas, j'ai utilisé un LinearLayout pour tout envelopper.
Ensuite, dans votre code, vous devez définir un écouteur tactile sur votre LinearLayout principal.
J'espère que cela aidera certaines personnes. Ou du moins les aide à commencer à résoudre leur problème.
la source
Définissez simplement deux propriétés du parent de celui-ci
EditText
comme suit:Ainsi, lorsque l'utilisateur touchera en dehors de la
EditText
zone, le focus sera supprimé car le focus sera transféré vers la vue parent.la source
J'ai un
ListView
composé deEditText
points de vue. Le scénario dit qu'après avoir édité du texte dans une ou plusieurs lignes, nous devrions cliquer sur un bouton appelé «terminer». J'ai utiliséonFocusChanged
laEditText
vue à l'intérieur delistView
mais après avoir cliqué sur Terminer, les données ne sont pas enregistrées. Le problème a été résolu en ajoutantà l'intérieur du
onClickListener
bouton "Terminer" et les données ont été enregistrées avec succès.la source
Je pense vraiment que c'est une manière plus robuste d'utiliser
getLocationOnScreen
quegetGlobalVisibleRect
. Parce que je rencontre un problème. Il y a un Listview qui contient quelques Edittext et et définiajustpan
dans l'activité. Je trouvegetGlobalVisibleRect
return une valeur qui ressemble à y compris le scrollY, mais le event.getRawY est toujours à l'écran. Le code ci-dessous fonctionne bien.la source
Pour perdre le focus lorsque vous touchez une autre vue, les deux vues doivent être définies comme view.focusableInTouchMode (true).
Mais il semble que l'utilisation de la mise au point en mode tactile ne soit pas recommandée. Veuillez jeter un œil ici: http://android-developers.blogspot.com/2008/12/touch-mode.html
la source
Le meilleur moyen est d'utiliser la méthode par défaut
clearFocus()
Vous savez résoudre les codes à
onTouchListener
droite?Appelez
EditText.clearFocus()
. Il mettra clairement l'accentlast EditText
.la source
Comme @pcans l'a suggéré, vous pouvez effectuer cette substitution
dispatchTouchEvent(MotionEvent event)
dans votre activité.Ici, nous obtenons les coordonnées tactiles et les comparons pour afficher les limites. Si le toucher est effectué en dehors d'une vue, faites quelque chose.
Il n'est pas non plus nécessaire de vérifier l'existence et la visibilité de la vue si la mise en page de votre activité ne change pas pendant l'exécution (par exemple, vous n'ajoutez pas de fragments ou ne remplacez / supprimez pas les vues de la mise en page). Mais si vous souhaitez fermer (ou faire quelque chose de similaire) le menu contextuel personnalisé (comme dans le Google Play Store lorsque vous utilisez le menu de débordement de l'élément), il est nécessaire de vérifier l'existence de la vue. Sinon, vous obtiendrez un fichier
NullPointerException
.la source
Ce simple extrait de code fait ce que vous voulez
la source
À Kotlin
hidekeyboard () est une extension Kotlin
En activité, ajouter une expédition
Ajoutez ces propriétés dans le parent le plus haut
la source
Ceci est ma version basée sur le code de zMan. Il ne masquera pas le clavier si la vue suivante est également un texte d'édition. Il ne masquera pas non plus le clavier si l'utilisateur fait simplement défiler l'écran.
la source