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