Moim zdaniem mam wyszukiwanie EditText i chciałbym programowo wywołać zachowanie zdarzenia kliknięcia na polu, tj. Skupić się na polu tekstowym ORAZ wyświetlić klawiaturę ekranową, jeśli to konieczne (jeśli nie ma twardej klawiatury).
Próbowałem field.requestFocus()
. Pole faktycznie jest fokusem, ale klawiatura programowa nie jest wyświetlana.
Próbowałem field.performClick()
. Ale to tylko wywołuje OnClickListener pola.
Dowolny pomysł ?
android
android-edittext
sdabet
źródło
źródło
field.requestFocus()
wonResume()
sposobie działania (zamiastonCreate()
). Nie wiem dokładnie, dlaczego to działa ...onResume
ponieważonResume
jest wywoływane poonCreate
, więcfield
nie istnieje, dopóki nieonCreate
zostanie uruchomione. Zobacz tutaj: developer.android.com/reference/android/app/…Oto kod, który działał dla mnie.
edittext.post(new Runnable() { public void run() { edittext.requestFocusFromTouch(); InputMethodManager lManager = (InputMethodManager)getActivity().getSystemService(Context.INPUT_METHOD_SERVICE); lManager.showSoftInput(edittext, 0); } });
Otóż to! Cieszyć się ;)
źródło
EditText
programowo, gdy użytkownik naciska przycisk.EditText
z okna dialogowego. Niektóre flagi są ustawiane przez Androida, które powodują, że ta kontrolka nie otrzymuje żadnych dotknięć. Jeśli dodasz pole w pliku runnable, flagi nie zostaną ustawione.InputType
naEditText
to, że Android ustawia wartość null. Jeśli ustawiszInputType
, powinno działać.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.requestFocus(); <-- that doesn't work passwordInput.postDelayed(new ShowKeyboard(), 300); //250 sometimes doesn't run if returning from LockScreen }
Gdzie
ShowKeyboard
jestprivate 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ę, ż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()
narequestFocusFromTouch()
.EDYCJA: Nie używaj
requestFocusFromTouch()
, daje to zdarzenie dotykowe programowi uruchamiającemu. Trzymaj sięrequestFocus()
.EDIT2: W Dialogs (
DialogFragment
) użyj następującegogetDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
zamiast
getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
źródło
requestFocusFromTouch()
wydaje się wywoływać zdarzenie dotykowe w programie uruchamiającym. To jest dziwne.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)); } });
źródło
W moim przypadku chciałem wyświetlić wirtualną klawiaturę bez odniesienia do konkretnego pola tekstowego, więc skupiłem się na pierwszej części zaakceptowanej odpowiedzi :
edittext.setFocusableInTouchMode(true); edittext.requestFocus();
Następnie pokazuję wirtualną klawiaturę :
InputMethodManager inputMethodManager = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
źródło