El siguiente código funcionó para mí , después de que las otras dos respuestas no funcionaron para mí :
@Override
public void onResume() {
super.onResume();
SingletonBus.INSTANCE.getBus().register(this);
passwordInput.postDelayed(new ShowKeyboard(), 300);
}
Donde ShowKeyboard
esta
private class ShowKeyboard implements Runnable {
@Override
public void run() {
passwordInput.setFocusableInTouchMode(true);
passwordInput.requestFocus();
getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
((InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE)).showSoftInput(passwordInput, 0);
}
}
Después de una entrada exitosa, también me aseguro de ocultar el teclado
getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
((InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE))
.hideSoftInputFromWindow(getView().getWindowToken(), 0);
Técnicamente, acabo de agregar 300 ms de retraso antes de ejecutar la solicitud de visualización del teclado en pantalla. Extraño, ¿verdad? También cambiado requestFocus()
a requestFocusFromTouch()
.
EDITAR: No lo use, requestFocusFromTouch()
le da un evento táctil al lanzador. Quédate con requestFocus()
.
EDIT2: En Dialogs ( DialogFragment
), use lo siguiente
getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
en vez de
getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);