Je veux juste que lorsque l'on clique en dehors du "edittext", le focus soit automatiquement perdu et le clavier caché. Pour l'instant, si je clique sur le "edittext", il se focalise mais je dois appuyer sur le bouton retour pour le défocaliser.
Réponses
Trop de publicités?Voici une méthode universelle pour tous les écrans. Mettez-la dans votre activité
override fun dispatchTouchEvent(ev: MotionEvent?): Boolean {
clearFocusOnOutsideClick()
return super.dispatchTouchEvent(ev)
}
/*
* Clear focus on outside click
* */
private fun clearFocusOnOutsideClick() {
currentFocus?.apply {
if (this is EditText) {
clearFocus()
}
//Hide keyboard
val imm: InputMethodManager =
getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
imm.hideSoftInputFromWindow(windowToken, InputMethodManager.HIDE_NOT_ALWAYS)
}
}
J'ai donc cherché un peu, et aucune autre solution ne correspondait exactement à ce que je cherchais. À mon avis, le focus se comporte étrangement sur les vues EditText.
Ce que j'ai fait, c'est...
-
Assurez-vous que la vue racine est un RelativeLayout.
-
Ajoutez un modèle de superposition qui se trouve SUR la zone qui fera disparaître le clavier, mais pas l'EditText. Quelque chose comme ci-dessous :
Dans mon cas, l'EditText se trouvait dans un conteneur en bas de l'écran, et couvrait donc tout le reste.
-
J'ai une méthode qui ressemble un peu à celle-ci :
private void hideKeyboard() { final InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT\_METHOD\_SERVICE); imm.hideSoftInputFromWindow(editText.getWindowToken(), 0); keyboardOverlay.setVisibility(View.GONE); editText.clearFocus(); }
-
Appelez maintenant cette méthode lors du onClick de la superposition que vous avez créée.
-
Ce que nous voulons maintenant, c'est rendre la superposition visible lorsque vous appuyez sur l'editText. Vous ne pouvez pas utiliser l'événement onFocus (du moins je n'ai pas réussi à le faire fonctionner...) Donc ce que j'ai fait, c'est gérer l'événement onTouch à la place.
editText.setOnTouchListener(new OnTouchListener() {
@Override public boolean onTouch(final View v, final MotionEvent event) { keyboardOverlay.setVisibility(View.VISIBLE); editText.requestFocus(); return false; }
});
Le requestFocus() permet ici de ne pas surcharger l'événement focus avec le onTouch.
Un conseil rapide, lorsque vous essayez ce système, vous pouvez ajouter une couleur de fond à la superposition pour voir exactement ce qui se passe.
J'espère que cela fonctionnera pour vous !
Dans un bouton ou une vue quelconque : this.getCurrentFocus().clearFocus() ; Par exemple :
@Override
public boolean onMenuOpened(int featureId, Menu menu) {
InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
this.getCurrentFocus().clearFocus();
return super.onMenuOpened(featureId, menu);
}
-
To tap outside
vous devriez remarquerOnTouchListener
droite. -
To clear focus in Edit Text
.
La meilleure façon est d'utiliser la méthode par défaut [clearFocus()
](http://developer.android.com/reference/android/view/View.html#clearFocus())
Appelez simplement EditText.clearFocus()
. Il permettra de se concentrer sur last EditText
.
J'avais la même exigence, car je devais masquer le clavier dès que je touchais quelque chose en dehors de ma zone d'édition. Le site setOnFocusChangeListener ne fait pas l'affaire car même si vous touchez à l'extérieur, la zone de texte éditée reste sélectionnée.
Pour cela, j'ai utilisé la solution edc598 aquí .
- J'ai d'abord obtenu le MainLayout contenant la vue entière et j'y ai ajouté un écouteur tactile.
- Lorsque l'événement onTouch est déclenché, je vérifie si la boîte EditText a le focus.
- Si la boîte EditText a le focus, je vérifie les coordonnées X-Y de l'événement.
- En fonction de l'emplacement de ma boîte d'édition, je cache le clavier si on le touche à l'extérieur de la boîte.
Exemple de code modifié à partir de aquí :
LinearLayout MainLayout = (LinearLayout) findViewById(R.id.MainLayout);
EditText textBox = (EditText) findViewById(R.id.textBox);
int X_TOP_LEFT = 157;
int Y_TOP_LEFT = 388;
int X_BOTTOM_RIGHT = 473;
int Y_BOTTOM_RIGHT = 570;
MainLayout.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
if(textBox.isFocused()){
Log.i("Focussed", "--" + event.getX() + " : " + event.getY() + "--");
if(event.getX() <= 157 || event.getY() <= 388 || event.getX() >= 473 || event.getY() >= 569){
//Will only enter this if the EditText already has focus
//And if a touch event happens outside of the EditText
textBox.clearFocus();
InputMethodManager imm = (InputMethodManager) v.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
//Do something else
}
}
Log.i("X-Y coordinate", "--" + event.getX() + " : " + event.getY() + "--");
//Toast.makeText(getBaseContext(), "Clicked", Toast.LENGTH_SHORT).show();
return false;
}
});
- Réponses précédentes
- Plus de réponses
0 votes
Question connexe : stackoverflow.com/q/4165414/782870 . Je pense que la plupart des réponses ont déjà été testées et se sont avérées efficaces.
0 votes
J'ai trouvé cette réponse : stackoverflow.com/a/28939113/2610855 Le meilleur.
0 votes
Vous devriez donner à Sudhanshu Gaur la réponse acceptée, sa solution fonctionne réellement.