web-dev-qa-db-fra.com

Android TextField: définissez le focus + entrée logicielle par programme

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 ?

67
fiddler

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);
135
pgsandstrom

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 ;)

49
elisabel

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
}

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);
4
EpicPandaForce

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);
0
DependencyHell
        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));
            }
        });
0
Intra