Poniższy kod pracował dla mnie , po dwóch innych odpowiedzi nie działa dla mnie :
@Override
public void onResume() {
super.onResume();
SingletonBus.INSTANCE.getBus().register(this);
passwordInput.postDelayed(new ShowKeyboard(), 300);
}
Gdzie ShowKeyboard
jest
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);
}
}
Po udanym wprowadzeniu upewniam się, że ukryłem klawiaturę
getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
((InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE))
.hideSoftInputFromWindow(getView().getWindowToken(), 0);
Technicznie, właśnie dodałem 300 ms opóźnienia przed uruchomieniem żądania wyświetlania klawiatury programowej. Dziwne, prawda? Zmieniono również requestFocus()
na requestFocusFromTouch()
.
EDYCJA: Nie używaj requestFocusFromTouch()
, daje to zdarzenie dotykowe programowi uruchamiającemu. Trzymaj się requestFocus()
.
EDIT2: W Dialogs ( DialogFragment
) użyj następującego
getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
zamiast
getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);