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


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

пробовал field.requestFocus(). Поле фактически получает фокус, но мягкая клавиатура не отображается.

пробовал field.performClick(). Но это только вызывает OnClickListener поля.

есть идеи ?

4 61

4 ответа:

добрый сэр, попробуйте этот:

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

Я не уверен, но это может потребоваться на некоторых телефонах (некоторые из старых устройств):

final InputMethodManager inputMethodManager = (InputMethodManager) context
                .getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.showSoftInput(edittext, InputMethodManager.SHOW_IMPLICIT);

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

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

вот именно! Наслаждайтесь ;)

The следующий кодработал для меня, после еще два ответау меня не получилось:

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