następujący kodpracował dla mnie, po dwóch innych odpowiedzinie działa dla mnie:
@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
}
Gdzie ShowKeyboard
jest
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);
}
}
Po udanym wprowadzeniu, upewniam się również, że ukrywam klawiaturę
getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
((InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE))
.hideSoftInputFromWindow(getView().getWindowToken(), 0);
Z technicznego punktu widzenia dodałem 300 ms opóźnienia przed uruchomieniem żądania wyświetlenia klawiatury miękkiej. Dziwne, prawda? Zmieniono również requestFocus()
na requestFocusFromTouch()
.
EDYCJA: Nie używaj requestFocusFromTouch()
, ponieważ daje to wydarzenie dotykowe w programie uruchamiającym. Trzymaj się z requestFocus()
.
EDIT2: w oknach dialogowych (DialogFragment
), użyj następujących
getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
zamiast
getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
sam wynik jak requestFocus (...) sam Pole dostaje ostrość, ale klawiatura nie jest wyzwalane. – fiddler
W końcu rozwiązałem wydane przez wywołanie 'field.requestFocus()' w metodzie 'onResume()' działania (zamiast 'onCreate()'). Nie wiem dokładnie, dlaczego to działa ... – fiddler
Widok nie może skupić się, zanim zostanie wyświetlony na ekranie. Nie można tego zrobić, gdy onCreate() przechowuje wątek UI, dlatego widok jest ułożony bezpośrednio po onCreate() i przed onResume(). :) – pgsandstrom