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:
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.
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;
}
});
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")
}
}