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 View
de votre activité, et vérifier si c'est un instanceof EditText
si ce n'est pas enregistrer un setOnTouchListener
dans 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 setContentView
dans votre activité. Dans le cas où vous vous demandez quel paramètre vous passeriez, c'est celui id
du 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 Activity
et 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 Activity
et 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)
}
}