L'extrait suivant masque simplement le clavier:
public static void hideSoftKeyboard(Activity activity) {
InputMethodManager inputMethodManager =
(InputMethodManager) activity.getSystemService(
Activity.INPUT_METHOD_SERVICE);
inputMethodManager.hideSoftInputFromWindow(
activity.getCurrentFocus().getWindowToken(), 0);
}
Vous pouvez mettre cela dans une classe utilitaire, ou si vous le définissez dans une activité, évitez le paramètre d'activité ou appelez hideSoftKeyboard(this).
La partie la plus délicate est de savoir quand l'appeler. Vous pouvez écrire une méthode qui réitère chaque étape Viewde votre activité, et vérifier si c'est un instanceof EditTextsi ce n'est pas enregistrer un setOnTouchListenerdans ce composant et tout se mettra en place. Si vous vous demandez comment faire, c'est en fait assez simple. Voici ce que vous faites, vous écrivez une méthode récursive comme la suivante, en fait, vous pouvez l'utiliser pour faire n'importe quoi, comme configurer des polices de caractères personnalisées, etc. Voici la méthode
public void setupUI(View view) {
// Set up touch listener for non-text box views to hide keyboard.
if (!(view instanceof EditText)) {
view.setOnTouchListener(new OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
hideSoftKeyboard(MyActivity.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);
}
}
}
C'est tout, appelez simplement cette méthode après vous setContentViewdans votre activité. Dans le cas où vous vous demandez quel paramètre vous passeriez, c'est celui iddu conteneur parent. Attribuez un idà votre conteneur parent comme
<RelativeLayoutPanel android:id="@+id/parent"> ... </RelativeLayout>
et appeler setupUI(findViewById(R.id.parent)), c'est tout.
Si vous souhaitez l'utiliser efficacement, vous pouvez créer une extension Activityet insérer cette méthode, et faire en sorte que toutes les autres activités de votre application étendent cette activité et l'appellent setupUI()dans la onCreate()méthode.
J'espère que cela aide.
Si vous utilisez plus d'une activité, définissez l'ID commun à la disposition parent comme
<RelativeLayout android:id="@+id/main_parent"> ... </RelativeLayout>
Ensuite, étendez une classe à partir de Activityet définissez setupUI(findViewById(R.id.main_parent))Dans son OnResume()et étendez cette classe au lieu de `` Activitéin your program
Voici une version Kotlin de la fonction ci-dessus:
@file:JvmName("KeyboardUtils")
fun Activity.hideSoftKeyboard() {
currentFocus?.let {
val inputMethodManager = ContextCompat.getSystemService(this, InputMethodManager::class.java)!!
inputMethodManager.hideSoftInputFromWindow(it.windowToken, 0)
}
}