Текстовое поле Android: программно установить фокус программный ввод

#android #android-edittext

#Android #android-редактировать текст

Вопрос:

На мой взгляд, у меня есть поисковый EditText, и я хотел бы программно запустить поведение события щелчка по полю, т. е. сфокусировать текстовое поле и при необходимости отобразить программную клавиатуру (если нет доступной жесткой клавиатуры).

Я пытался 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);
  

Комментарии:

1. Тот же результат, что и при использовании только requestFocus()… Поле получает фокус, но программная клавиатура не запускается.

2. Я, наконец, решил проблему, вызвав field.requestFocus() в onResume() методе activity (вместо onCreate() ). Точно не знаю, почему это работает…

3. Вид не может быть сфокусирован до того, как он фактически будет размещен на экране. Это невозможно сделать, пока onCreate () поддерживает поток пользовательского интерфейса, поэтому представление отображается непосредственно после onCreate() и перед onResume() . 🙂

4. В @fiddler Это работает, onResume потому что onResume вызывается после onCreate , поэтому field не существует до onCreate запуска. Смотрите здесь: developer.android.com/reference/android/app /…

5. Отличное предложение, старина. Я заявляю; это заслуживает одобрения!

Ответ №2:

Вот код, который сработал у меня.

 edittext.post(new Runnable() {
    public void run() {
        edittext.requestFocusFromTouch();
        InputMethodManager lManager = (InputMethodManager)getActivity().getSystemService(Context.INPUT_METHOD_SERVICE); 
        lManager.showSoftInput(edittext, 0);
    }
});
  

Вот и все! Наслаждайтесь 😉

Комментарии:

1. Спасибо, и это сработало для меня. Я добавляю EditText программно, когда пользователь нажимает кнопку.

2. Я добавил EditText из модального диалога. Android устанавливает некоторые флаги, из-за которых этот элемент управления не получает никаких касаний. Если вы добавите поле в runnable, флаги не будут установлены.

3. Похоже, что для InputType из EditText Android устанавливается значение null. Если вы установите InputType , это должно сработать.

4. Единственное рабочее решение для меня (если я использую InputMethod Manager для отображения принудительной клавиатуры, тогда я не смогу это скрыть)

5. Ни один из других методов у меня не работал, но этот сработал. Я хотел, чтобы у пользователей было окно, в которое можно щелкнуть, чтобы открыть диалоговое окно редактирования, вместо того, чтобы нажимать на строку редактирования для просмотра EditText. На телефоне строка редактирования теряет большую часть своей функциональности, поскольку диалоговое окно редактирования занимает весь экран, поэтому пользователь в любом случае не может видеть строку редактирования, включая буквы, входящие в нее во время ввода.

Ответ №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() .

РЕДАКТИРОВАНИЕ 2: В диалоговых окнах ( DialogFragment ) используйте следующее

 getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
  

вместо

 getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
  

Комментарии:

1. requestFocusFromTouch() кажется, вызывает событие касания на панели запуска. Это странно.

2. Для скрытия клавиатуры также необходимо изменить строку кода ((InputMethodManager) getActivity() …» для использования в DialogFragment или достаточно строки кода, о которой вы упомянули выше?

3. Скорее всего, это должно сработать, но вы всегда можете попробовать и посмотреть

Ответ №4:

В моем случае я хотел отобразить виртуальную клавиатуру без ссылки на конкретное текстовое поле, поэтому я использовал первую часть принятого ответа для фокусировки :

 edittext.setFocusableInTouchMode(true);
edittext.requestFocus();
  

Затем я показываю виртуальную клавиатуру :

 InputMethodManager inputMethodManager = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
  

Ответ №5:

для kotlin реализуйте использование функции расширения следующим образом

 fun View.showSoftKeyboard() {
    this.requestFocus()
    val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    imm.showSoftInput(this, InputMethodManager.SHOW_IMPLICIT)
}
  

Ответ №6:

         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));
            }
        });
  

Ответ №7:

В моем случае именно это решило все проблемы:

 val inputMethodManager: InputMethodManager = 
   context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
inputMethodManager.showSoftInput(edittext, InputMethodManager.SHOW_IMPLICIT)
  

Я поместил его в адаптер RecyclerView, потому что я использую привязку данных.
Также я не использовал, edittext.setFocusableInTouchMode(true) потому что в моем макете это true по умолчанию.
И не используйте эту строку: edittext.requestFocus() . Когда я удалил его, он начал работать 🙂

Ответ №8:

значение mAlertDialog = mBuilder.show()

         //Coloca o foo no txtDlgQuantidade e então chama o teclado
        mDialogView.txtDlgQuantidade.isFocusable = true
        mDialogView.txtDlgQuantidade.isFocusableInTouchMode = true
        mDialogView.txtDlgQuantidade.requestFocus()
        mAlertDialog.window?.clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE or WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM)
        mAlertDialog.window?.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE)