web-dev-qa-db-fra.com

Afficher le clavier pour edittext quand fragment commence

Lorsque mon fragment commence, je veux que mon edittext soit actif/que l'utilisateur commence juste à le saisir. Je peux le mettre en évidence avec requestFocus (), mais je ne parviens pas à faire apparaître le clavier.

J'ai essayé à la fois ceci:

edit = (EditText) view.findViewById(R.id.search);
edit.requestFocus();
InputMethodManager imgr = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
imgr.showSoftInput(edit, 0);

et

edit = (EditText) view.findViewById(R.id.search);
InputMethodManager imgr = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
imgr.showSoftInput(edit, 0);
edit.requestFocus();

Comment puis-je obtenir le clavier pour apparaître pour EditText?

43
heero

Est-ce que ça marche?

imgr.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY);
85
Sam

Tu peux essayer ça

@Override
public void onResume() {
    super.onResume();
    edit.post(new Runnable() {
        @Override
        public void run() {
            edit.requestFocus();
            InputMethodManager imgr = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
            imgr.showSoftInput(edit, InputMethodManager.SHOW_IMPLICIT);
        }
    });
}
10
Ilya

Depuis que showSoftInput ne fonctionne pas dans tous les cas et après avoir essayé certaines des solutions mentionnées ici, comme:

if (binding.account.requestFocus()) {
  getActivity().getWindow()
      .setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
}

Je l'ai finalement fait fonctionner avec :

if (binding.account.requestFocus()) {
  ((InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE)).toggleSoftInput(
      InputMethodManager.SHOW_FORCED,
      InputMethodManager.HIDE_IMPLICIT_ONLY
  );
}

Puisque:

 binding.account.requestFocus()

demande seulement le focus pour la EditText (cela n'ouvre pas le clavier)

et 

((InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE)).toggleSoftInput(
      InputMethodManager.SHOW_FORCED,
      InputMethodManager.HIDE_IMPLICIT_ONLY
  );

est la seule solution qui semble fonctionner correctement pour afficher le clavier (et le plus voté)

Bonne chance! :-)

6
cesards
    @Override
public void onHiddenChanged (boolean hidden)
{
    super.onHiddenChanged(hidden);

    if(hidden)
    {
        hideKeyboard(yourView);
    }
    else
    {
        toggleKeyboard(yourView);
    }
}

    public static void toggleKeyboard(View v)
{
    InputMethodManager imm = (InputMethodManager) v.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
    v.requestFocus();

    imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_NOT_ALWAYS);
}

public static void hideKeyboard(View v)
{
    InputMethodManager imm = (InputMethodManager) v.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);

    imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
}
2
Rubber Duck

J'ai une extension utile pour ça: 

fun EditText.showKeyboard() {
    if (requestFocus()) {
        (getActivity()?.getSystemService(INPUT_METHOD_SERVICE) as InputMethodManager)
            .showSoftInput(this, SHOW_IMPLICIT)
        setSelection(text.length)
    }
}

Vous aurez également besoin de celui-ci: 

fun View.getActivity(): AppCompatActivity?{
    var context = this.context
    while (context is ContextWrapper) {
        if (context is AppCompatActivity) {
            return context
        }
        context = context.baseContext
    }
    return null
}
2
Rafols

Une autre façon de rendre le clavier ouvert au démarrage de votre fragment consiste à appeler requestFocus() dans onCreateView et à réagir en conséquence en ouvrant le clavier si et seulement si EditText est focusable.

if(this.editText.requestFocus())
{
    getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
}
0
DiscDev