Selon moi, j’ai une recherche EditText et je voudrais déclencher par programme le comportement d’un événement de clic sur le champ, c’est-à-dire donner le focus au champ de texte ET afficher le clavier virtuel si nécessaire (si aucun clavier matériel n'est disponible).
J'ai essayé field.requestFocus()
. Le champ est effectivement activé, mais le clavier logiciel n'est pas affiché.
J'ai essayé field.performClick()
. Mais cela n’appelle que l’OnClickListener du champ.
Une idée ?
Bon monsieur, essayez ceci:
edittext.setFocusableInTouchMode(true);
edittext.requestFocus();
Je ne suis pas sûr, mais cela pourrait être nécessaire sur certains téléphones (certains appareils plus anciens):
final InputMethodManager inputMethodManager = (InputMethodManager) context
.getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.showSoftInput(edittext, InputMethodManager.SHOW_IMPLICIT);
Voici le code qui a fonctionné pour moi.
edittext.post(new Runnable() {
public void run() {
edittext.requestFocusFromTouch();
InputMethodManager lManager = (InputMethodManager)getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
lManager.showSoftInput(edittext, 0);
}
});
C'est tout! Prendre plaisir ;)
Le code suivant a fonctionné pour moi , après les autres deux réponses n'a pas fonctionné pour moi :
@Override
public void onResume() {
super.onResume();
SingletonBus.INSTANCE.getBus().register(this);
//passwordInput.requestFocus(); <-- that doesn't work
passwordInput.postDelayed(new ShowKeyboard(), 300); //250 sometimes doesn't run if returning from LockScreen
}
Où ShowKeyboard
est
private class ShowKeyboard implements Runnable {
@Override
public void run() {
passwordInput.setFocusableInTouchMode(true);
// passwordInput.requestFocusFromTouch();
passwordInput.requestFocus();
getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
((InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE)).showSoftInput(passwordInput, 0);
}
}
Après une saisie réussie, je m'assure également de cacher le clavier
getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
((InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE))
.hideSoftInputFromWindow(getView().getWindowToken(), 0);
Techniquement, je viens d'ajouter 300 ms de délai avant d'exécuter la demande d'affichage du clavier logiciel. Bizarre, non? Également changé de requestFocus()
en requestFocusFromTouch()
.
EDIT: N'utilisez pas requestFocusFromTouch()
, cela donnerait un événement tactile au lanceur. Coller avec requestFocus()
.
EDIT2: Dans les dialogues (DialogFragment
), utilisez ce qui suit
getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
au lieu de
getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
Dans mon cas, je voulais afficher le clavier virtuel sans référence à une zone de texte spécifique. J'ai donc utilisé la première partie de la réponse acceptée à focus :
edittext.setFocusableInTouchMode(true);
edittext.requestFocus();
Ensuite, je montre le clavier virtuel :
InputMethodManager inputMethodManager = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
field.post(new Runnable() {
@Override
public void run() {
field.requestFocus();
field.onKeyUp(KeyEvent.KEYCODE_DPAD_CENTER, new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_DPAD_CENTER));
}
});