web-dev-qa-db-fra.com

Comment masquer le clavier par un clic en dehors d'un edittext?

Je veux masquer le clavier en tapant hors de edittext. Ceci est mon code XML:

<RelativeLayout
Android:clickable="true"
Android:focusable="true"
Android:focusableInTouchMode="true"
Android:onClick="rl_main_onClick">
<RelativeLayout
  //Here there are some widgets including some edittext.
</RelativeLayout>

Ceci est mon code Java (MainActivity):

public void rl_main_onClick(View view) {
    InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
}

Mais je dois taper deux fois pour cacher le clavier. Le premier tap modifie simplement "next" (pour le dernier edittext c'est "done") pour entrer dans l'icône, puis le second tap cache le clavier. C'est ce qui se passe au premier tap:

 What the first tap does.

Maintenant, j'ai deux questions:

1- Comment puis-je réparer et cacher le clavier d'un seul toucher?

2- Est-il possible de le faire pour tous mes edittext (un code pour tous)?

Merci d'avance.

6

Essayez de remplacer onClick par onTouch. Pour cela, vous devez modifier vos attributs de présentation de la manière suivante:

<RelativeLayout
    Android:id="@+id/relativeLayout"
    Android:clickable="true"
    Android:focusable="true"
    Android:focusableInTouchMode="true">

    <RelativeLayout>

        // widgets here

    </RelativeLayout>

</RelativeLayout>

Ensuite, supprimez la méthode rl_main_onClick(View view) {...} et insérez la méthode onTouch listener dans onCreate():

findViewById(R.id.relativeLayout).setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
        return true;
    }
});
9
Marat

J'utilise ci-dessous Process. Cela fonctionne parfaitement pour moi. Ajoutez la fonction ci-dessous dans votre classe d'activité.

  override fun dispatchTouchEvent(event: MotionEvent): Boolean {
if (event.action == MotionEvent.ACTION_DOWN) {
    val v = currentFocus
    if (v is EditText) {
        val outRect = Rect()
        v.getGlobalVisibleRect(outRect)
        if (!outRect.contains(event.rawX.toInt(), event.rawY.toInt())) {
            Log.d("focus", "touchevent")
            v.clearFocus()
            val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
            imm.hideSoftInputFromWindow(v.windowToken, 0)
        }
    }
}
return super.dispatchTouchEvent(event)}

Vous pouvez vérifier l'état de la mise au point à l'aide du code ci-dessous. Activité et fragment 

appCompatEditText.onFocusChangeListener = View.OnFocusChangeListener { view, hasFocus ->
            if (!hasFocus) {
                toast("Focus Off")
            }else {
                toast("Focus On")
            }
        }
0
Shohel Rana