J'ai une Activity
avec une EditText
, un bouton et une ListView
. Le but est de taper un écran de recherche dans EditText
, d'appuyer sur le bouton et de faire en sorte que les résultats de la recherche remplissent cette liste.
Tout cela fonctionne parfaitement, mais le clavier virtuel se comporte de manière étrange.
Si je clique sur EditText
, je reçois le clavier virtuel. Si je clique sur le bouton "Terminé" du clavier virtuel, il disparaît. Cependant, si je clique sur mon bouton de recherche avant de cliquer sur "Terminé" sur le clavier virtuel, le clavier virtuel reste et je ne peux pas m'en débarrasser. Cliquer sur le bouton "Terminé" ne ferme pas le clavier. Il change le bouton "Terminé" de "Terminé" en une flèche et reste visible.
Merci de votre aide
mMyTextView.setOnEditorActionListener(new TextView.OnEditorActionListener() {
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if (actionId == EditorInfo.IME_ACTION_SEARCH) {
// hide virtual keyboard
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(m_txtSearchText.getWindowToken(),
InputMethodManager.RESULT_UNCHANGED_SHOWN);
return true;
}
return false;
}
});
InputMethodManager inputManager = (InputMethodManager)
getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(),
InputMethodManager.HIDE_NOT_ALWAYS);
Je mets cela juste après l'événement onClick(View v)
.
Vous devez importer Android.view.inputmethod.InputMethodManager
;
Le clavier se cache lorsque vous cliquez sur le bouton.
Utilisez le code ci-dessous
your_button_id.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
try {
InputMethodManager imm = (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
} catch (Exception e) {
}
}
});
Vous devez implémenter OnEditorActionListener
pour votre EditView
public void performClickOnDone(EditView editView, final View button){
textView.setOnEditorActionListener(new OnEditorActionListener() {
@Override
public boolean onEditorAction(EditView v, int actionId, KeyEvent event) {
hideKeyboard();
button.requestFocus();
button.performClick();
return true;
}
});
Et vous cachez le clavier par:
public void hideKeybord(View view) {
inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(),
InputMethodManager.RESULT_UNCHANGED_SHOWN);
}
Vous devez également déclencher le clavier caché dans votre bouton en utilisant onClickListener
Cliquez maintenant sur «Terminé» sur le clavier et le bouton virtuels pour obtenir le même résultat: masquer le clavier et effectuer une action de clic.
Ajoutez le code suivant dans votre événement de clic de bouton:
InputMethodManager inputManager = (InputMethodManager) getSystemService(this.INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
Pour l'activité,
InputMethodManager imm = (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
Pour les fragments, utilisez getActivity ()
getActivity (). getSystemService ();
getActivity (). getCurrentFocus ();
InputMethodManager imm = (InputMethodManager)getActivity().getSystemService(INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getActivity().getCurrentFocus().getWindowToken(), 0);
Puisque vous n'avez qu'un texte d'édition, il suffit d'appeler l'action effectuée pour ce texte d'édition dans le clic de votre bouton et le reste est traité par le système. Si vous aviez plus d'un edittext, cela ne serait pas aussi efficace car vous devez d'abord obtenir le edittext ciblé. Mais dans votre cas cela fonctionnera parfaitement
myedittext.onEditorAction(EditorInfo.IME_ACTION_DONE)
Cette solution fonctionne parfaitement pour moi:
private void showKeyboard(EditText editText) {
editText.requestFocus();
editText.setFocusableInTouchMode(true);
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(editText, InputMethodManager.RESULT_UNCHANGED_SHOWN);
editText.setSelection(editText.getText().length());
}
private void closeKeyboard() {
InputMethodManager inputManager = (InputMethodManager) getApplicationContext().getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), InputMethodManager.RESULT_UNCHANGED_SHOWN);
}
Essaye ça...
Pour montrer le clavier
editText.requestFocus();
InputMethodManager imm = (InputMethodManager) ctx.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
Pour masquer le clavier
InputMethodManager inputManager = (InputMethodManager) ctx.getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0);
View view = this.getCurrentFocus();
if (view != null) {
InputMethodManager imm =(InputMethodManager)this.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);enter code here}
Vous utilisez ce code dans votre événement de clic de bouton
// Check if no view has focus:
View view = this.getCurrentFocus();
if (view != null) {
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
Crash Null Point Fix Solution: J'ai eu un cas où le clavier pourrait ne pas s'ouvrir lorsque l'utilisateur clique sur le bouton. Vous devez écrire une instruction if pour vérifier que getCurrentFocus () n'est pas null:
InputMethodManager inputManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
if(getCurrentFocus() != null) {
inputManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
Exemple Kotlin:
val inputMethodManager = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
de fragment:
inputMethodManager.hideSoftInputFromWindow(activity?.currentFocus?.windowToken, InputMethodManager.HIDE_NOT_ALWAYS)
de l'activité:
inputMethodManager.hideSoftInputFromWindow(currentFocus?.windowToken, InputMethodManager.HIDE_NOT_ALWAYS)