Android TextField: программно настроить фокус + программный ввод
На мой взгляд, у меня есть поиск EditText, и я хотел бы программно спрогнозировать поведение события click в поле, то есть дать фокус на текстовое поле И отобразить мягкую клавиатуру, если это необходимо (если нет жесткой клавиатуры).
Я попробовал field.requestFocus()
. Поле действительно получает фокус, но мягкая клавиатура не отображается.
Я попробовал field.performClick()
. Но это вызывает только OnClickListener поля.
Любая идея?
Ответы
Ответ 1
Хороший сэр, попробуйте следующее:
edittext.setFocusableInTouchMode(true);
edittext.requestFocus();
Я не уверен, но это может потребоваться на некоторых телефонах (некоторые из старых устройств):
final InputMethodManager inputMethodManager = (InputMethodManager) context
.getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.showSoftInput(edittext, InputMethodManager.SHOW_IMPLICIT);
Ответ 2
Вот код, который работал у меня.
edittext.post(new Runnable() {
public void run() {
edittext.requestFocusFromTouch();
InputMethodManager lManager = (InputMethodManager)getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
lManager.showSoftInput(edittext, 0);
}
});
Что это! Наслаждайтесь;)
Ответ 3
Следующий код работал у меня, после двух других ответов не работал у меня:
@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
}
Где ShowKeyboard
есть
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);
}
}
После успешного ввода я также убеждаюсь, что скрываю клавиатуру
getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
((InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE))
.hideSoftInputFromWindow(getView().getWindowToken(), 0);
Технически я просто добавил 300 мс задержки перед запуском запроса на отображение мягкой клавиатуры. Странно, правда? Также изменился requestFocus()
на requestFocusFromTouch()
.
РЕДАКТИРОВАТЬ: Не использовать requestFocusFromTouch()
, он дает событие касания для запуска. Прикрепите requestFocus()
.
EDIT2: В диалоговом окне (DialogFragment
) используйте следующие
getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
вместо
getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
Ответ 4
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));
}
});