52 votes

Tapez en dehors du texte pour perdre la mise au point

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.

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.

2voto

Sergei Maleev Points 189

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)
    }
}

kotlin clearfocus Android à l'extérieur de

1voto

Charles Points 194

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...

  1. Assurez-vous que la vue racine est un RelativeLayout.

  2. 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.

  1. 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();
    }
  2. Appelez maintenant cette méthode lors du onClick de la superposition que vous avez créée.

  3. 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 !

0voto

user198829 Points 16

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);
}

-1voto

Alex Tran Points 739
  • To tap outside vous devriez remarquer OnTouchListener 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 .

-7voto

Sumitk Points 322

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;
    }
});

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X