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.

44voto

Sudhanshu Gaur Points 2384

Pour résoudre ce problème, il faut d'abord utiliser l'écouteur setOnFocusChangeListener de cet Edittext.

edittext.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                if (!hasFocus) {
                    Log.d("focus", "focus lost");
                    // Do whatever you want here
                } else {
                    Log.d("focus", "focused");
                }
            }
        });

et ensuite, ce que vous devez faire est de surcharger dispatchTouchEvent dans l'activité qui contient l'Edittext voir le code ci-dessous

@Override
    public boolean dispatchTouchEvent(MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            View v = getCurrentFocus();
            if ( v instanceof EditText) {
                Rect outRect = new Rect();
                v.getGlobalVisibleRect(outRect);
                if (!outRect.contains((int)event.getRawX(), (int)event.getRawY())) {
                    Log.d("focus", "touchevent");
                    v.clearFocus();
                    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                    imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
                }
            }
        }
        return super.dispatchTouchEvent(event);
    }

Maintenant, ce qui va se passer, c'est que lorsqu'un utilisateur clique à l'extérieur, d'abord cet événement dispatchTouchEvent sera appelé, ce qui effacera le focus de l'editext, maintenant votre OnFocusChangeListener sera appelé que le focus a été changé, maintenant ici vous pouvez faire tout ce que vous vouliez faire, j'espère que cela fonctionne :)

19voto

lynnyilu Points 193

@woodshy a la réponse pour masquer le clavier, mais peut-être que mettre le code en onClick n'est pas aussi bon que de le mettre dans onFocusChanged . Pour le forcer à perdre le focus, vous devez définir l'objet vers lequel vous souhaitez transférer le focus, dans son fichier XML :

android:focusable="true"
android:focusableInTouchMode ="true"

0 votes

Puis-je avoir une question liée à celle-ci : vous voulez dire que ce code doit être placé dans le LinearLayout, ou dans l'EditText que je veux défocaliser ? Merci.

0 votes

Vous devez le mettre comme attribut de la vue parent (vue du contenu de votre activité). Vous pouvez vérifier ceci : stackoverflow.com/a/19828165/782870

14voto

woodshy Points 2578

Supposons que votre EditText soit placé sur une disposition linéaire ou un autre ViewGroup. Vous devez alors rendre ce conteneur cliquable, focalisable et focalisableInTouchMode. Ensuite, définissez l'écouteur onClickListener pour ce conteneur avec le code suivant dans la méthode de remplacement onClick :

@Override
public void onClick(View view) {
    InputMethodManager imm = (InputMethodManager) view.getContext()
            .getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}

1 votes

Dans mon cas, j'affiche un clavier numérique au moment de la mise au point du champ de texte. J'ai essayé d'utiliser votre solution. Lorsque je clique sur la vue d'arrière-plan, le clavier numérique se transforme en clavier alpha-numérique, puis lorsque je clique à nouveau, il disparaît.

0 votes

@AdilMalik, essayez de cacher le clavier de l'onFocusChangeListener de l'edittext également.

0 votes

J'ai le même problème @DmitryZenovich comment puis-je cacher le clavier des edittexts surfucschangelistener ?

3voto

Rajul Goel Points 31

Vous pouvez y parvenir en procédant comme suit :

Rendez la vue parent (vue du contenu de votre activité) cliquable et focalisable en ajoutant les attributs suivants

    android:clickable="true" 
    android:focusableInTouchMode="true" 

2. implémenter une méthode hideKeyboard()

    public void hideKeyboard(View view) {
        InputMethodManager inputMethodManager =(InputMethodManager)getSystemService(Activity.INPUT_METHOD_SERVICE);
        inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(), 0);
    }

Enfin, configurez l'écouteur onFocusChangeListener de votre edittext.

    edittext.setOnFocusChangeListener(new View.OnFocusChangeListener() {
        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            if (!hasFocus) {
                hideKeyboard(v);
            }
        }
    });

2voto

Kaushik NP Points 4649

Le code suivant fonctionne parfaitement pour moi, et je l'utilise régulièrement pour les opérations suivantes fermeture du SoftKeyboard au toucher n'importe où en dehors de l'EditText.

public void hideSoftKeyboard()
{
        //Hides the SoftKeyboard
        InputMethodManager inputMethodManager = (InputMethodManager)  getActivity().getSystemService(Activity.INPUT_METHOD_SERVICE);
        inputMethodManager.hideSoftInputFromWindow(getActivity().getCurrentFocus().getWindowToken(), 0);
}

public void setupUI(View view) 
{
        String s = "inside";
        //Set up touch listener for non-text box views to hide keyboard.
        if (!(view instanceof EditText)) {

            view.setOnTouchListener(new View.OnTouchListener() {

                public boolean onTouch(View v, MotionEvent event) {
                    hideSoftKeyboard();
                    return false;
                }

            });        
        }

    //If a layout container, iterate over children and seed recursion.
        if (view instanceof ViewGroup) {

            for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {

                View innerView = ((ViewGroup) view).getChildAt(i);

                setupUI(innerView);
            }
        }    
}

Il suffit donc d'appeler le setupUI() une fois dans votre onCreate() et voila, votre hidingSoftKeyboard est configuré !

Pour Perte totale de concentration de l'EditText, il suffit de faire editText.clearFocus() dans votre fonction hideSoftKeyboard().

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