masquer le clavier lorsque l'utilisateur tape n'importe où ailleurs sur l'écran dans android

J'ai besoin de cacher le softkeypad dans android lorsque l'utilisateur clique sur n'importe où autre Qu'un Edittext. Il y a beaucoup d'aide pour iphone mais pas pour android. J'ai essayé ce code mais ça ne marche pas: (

final RelativeLayout base = (RelativeLayout) findViewById(R.id.RelativeLayout1);

    findViewById(R.id.base).setOnClickListener(new OnClickListener() {

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

        }
    });

Merci d'avance !

27
demandé sur Chrishan 2012-01-02 08:52:37

6 réponses

Vous pouvez utiliser le onTouchEvent() pour masquer la Softkeyboard.

@Override
    public boolean onTouchEvent(MotionEvent event) {
        InputMethodManager imm = (InputMethodManager)getSystemService(Context.
                                                        INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
        return true;
    }

Bien que cette solution fonctionne, mais le mieux que je suggère est d'utiliser ci-dessous answer car il donne la meilleure solution de fermeture du clavier toucher n'importe où ailleurs puis EditText.

52
répondu Lalit Poptani 2017-05-23 11:47:29

Eh Bien, j'ai fait de cette façon:

Ajoutez du code dans votre activité .

Ce serait le travail de Fragment aussi, pas besoin de ajouter ce code dans Fragment.

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
    View view = getCurrentFocus();
    if (view != null && (ev.getAction() == MotionEvent.ACTION_UP || ev.getAction() == MotionEvent.ACTION_MOVE) && view instanceof EditText && !view.getClass().getName().startsWith("android.webkit.")) {
        int scrcoords[] = new int[2];
        view.getLocationOnScreen(scrcoords);
        float x = ev.getRawX() + view.getLeft() - scrcoords[0];
        float y = ev.getRawY() + view.getTop() - scrcoords[1];
        if (x < view.getLeft() || x > view.getRight() || y < view.getTop() || y > view.getBottom())
        ((InputMethodManager)this.getSystemService(Context.INPUT_METHOD_SERVICE)).hideSoftInputFromWindow((this.getWindow().getDecorView().getApplicationWindowToken()), 0);
    }
    return super.dispatchTouchEvent(ev);
}

Espère que cela va vous aider.

24
répondu Hiren Patel 2016-05-23 11:44:19

Le meilleur travail que j'ai trouvé était d'utiliser comme ci-dessous,

Remplacer dispatchTouchEvent() et essayer d'obtenir la zone de EditText utiliser Rect

 @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
         int x = (int) ev.getX();
         int y = (int) ev.getY();

         if (ev.getAction() == MotionEvent.ACTION_DOWN &&
             !getLocationOnScreen(etFeedback).contains(x, y)) {
             InputMethodManager input = (InputMethodManager) 
                                   activity.getSystemService(Context.INPUT_METHOD_SERVICE);
             input.hideSoftInputFromWindow(etFeedback.getWindowToken(), 0);
         }

        return super.dispatchTouchEvent(ev);
    }

Méthode qui calcule 4 coins de vue (ici son EditText)

protected Rect getLocationOnScreen(EditText mEditText) {
        Rect mRect = new Rect();
        int[] location = new int[2];

        mEditText.getLocationOnScreen(location);

        mRect.left = location[0];
        mRect.top = location[1];
        mRect.right = location[0] + mEditText.getWidth();
        mRect.bottom = location[1] + mEditText.getHeight();

        return mRect;
    }

En utilisant le code ci-dessus, nous pouvons détecter la zone de EditText et on peut vérifier si le tactile sur l'écran est la partie de la zone de EditText ou pas. Si sa partie de EditText alors ne faites rien Laissez le toucher faire son travail, et si le toucher ne contient pas de zone de EditText, fermez simplement le softkeyboard.

******modifier * * * * * *

Je viens de trouver une autre approche si nous ne voulons pas donner de EditText en entrée et que nous voulons cacher le clavier dans toute l'application lorsque l'utilisateur touche ailleurs que EditText. Ensuite, vous devez créer une BaseActivity et écrire du code global pour masquer le clavier comme ci-dessous,

 @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {

        boolean handleReturn = super.dispatchTouchEvent(ev);

        View view = getCurrentFocus();

         int x = (int) ev.getX();
         int y = (int) ev.getY();

         if(view instanceof EditText){
             View innerView = getCurrentFocus();

             if (ev.getAction() == MotionEvent.ACTION_UP && 
                                    !getLocationOnScreen(innerView).contains(x, y)) {

                 InputMethodManager input = (InputMethodManager) 
                                  getSystemService(Context.INPUT_METHOD_SERVICE);
                 input.hideSoftInputFromWindow(getWindow().getCurrentFocus()
                                                                 .getWindowToken(), 0);
             }
         }

        return handleReturn;
    }
13
répondu Lalit Poptani 2015-12-29 10:16:14

J'ai essayé ceci pour cacher le clavier. Vous devez passer la méthode dans votre fichier de mise en page.

public void setupUI(View view) {
    // 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(LOGSignUpActivity.this);
                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);
        }
    }
}
0
répondu Gowtham Subramaniam 2016-11-25 04:49:00

Appeler cette méthode dans votre MainAcitivity.class

  public static void hideKeyboardwithoutPopulate(BaseActivity activity) {
    InputMethodManager inputMethodManager =
            (InputMethodManager) activity.getSystemService(
                    Activity.INPUT_METHOD_SERVICE);
    inputMethodManager.hideSoftInputFromWindow(
            activity.getCurrentFocus().getWindowToken(), 0);
}
0
répondu Vishal Yadav 2017-09-28 13:45:57

Pour ceux qui recherchent un code Xamarin pour cela, voici:

  public override bool DispatchTouchEvent(MotionEvent ev)
    {
        try
        {
            View view = CurrentFocus;
            if (view != null && (ev.Action == MotionEventActions.Up || ev.Action == MotionEventActions.Move) && view is EditText && !view.Class.Name.StartsWith("android.webkit."))
            {
                int[] Touch = new int[2];
                view.GetLocationOnScreen(Touch);
                float x = ev.RawX + view.Left - Touch[0];
                float y = ev.RawY + view.Top - Touch[1];
                if (x < view.Left || x > view.Right || y < view.Top || y > view.Bottom)
                    ((InputMethodManager)GetSystemService(InputMethodService)).HideSoftInputFromWindow((Window.DecorView.ApplicationWindowToken), 0);
            }
        }
        catch (System.Exception ex)
        {

        }

        return base.DispatchTouchEvent(ev);
    }
0
répondu G.hakim 2017-11-29 06:47:03