Как отобразить софт-клавиатуру, когда текст редактирования сфокусирован - PullRequest
409 голосов
/ 24 февраля 2011

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

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

  2. И когда я нажимаю «Готово» на клавиатуре, клавиатура сбрасывается, но EditText остается в фокусе, а у вас нет желания (потому что мое редактирование завершено).

Чтобы возобновить, моя проблема в том, чтобы на iPhone было что-то похожее: синхронизировать клавиатуру с моим состоянием EditText (сфокусировано / не сфокусировано) и, конечно же, нет программной клавиатуры, если есть физическая один.

Ответы [ 35 ]

552 голосов
/ 24 февраля 2011

Чтобы заставить программную клавиатуру появляться, вы можете использовать

EditText yourEditText= (EditText) findViewById(R.id.yourEditText);
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(yourEditText, InputMethodManager.SHOW_IMPLICIT);

И для снятия фокуса на EditText, к сожалению, вам нужен манекен View, чтобы захватить фокус.

Надеюсь, это поможет


Чтобы закрыть его, вы можете использовать

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(yourEditText.getWindowToken(), 0);

Это работает для использования в диалоге

public void showKeyboard(){
    InputMethodManager inputMethodManager = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
    inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
}

public void closeKeyboard(){
    InputMethodManager inputMethodManager = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
    inputMethodManager.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0);
}
216 голосов
/ 16 октября 2011

У меня была такая же проблема.Сразу после изменения editText VISIBILITY с GONE на VISIBLE мне пришлось установить фокус и отобразить экранную клавиатуру.Я добился этого, используя следующий код:

new Handler().postDelayed(new Runnable() {

    public void run() {
//        ((EditText) findViewById(R.id.et_find)).requestFocus();
//              
        EditText yourEditText= (EditText) findViewById(R.id.et_find);
//        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
//        imm.showSoftInput(yourEditText, InputMethodManager.SHOW_IMPLICIT);

        yourEditText.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN , 0, 0, 0));
        yourEditText.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_UP , 0, 0, 0));                           
    }
}, 200);

Он работает для меня с задержкой 100 мс, но не удалось без задержки или только с задержкой 1 мс.

Комментируемая часть кода демонстрирует другой подход, который работает только на некоторых устройствах.Я тестировал на версиях ОС 2.2 (эмулятор), 2.2.1 (реальное устройство) и 1.6 (эмулятор).

Этот подход спас мне большую боль.

149 голосов
/ 03 мая 2012

Чтобы вызвать появление клавиатуры, используйте

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);

Этот метод более надежен, чем прямой вызов InputMethodManager.

Чтобы закрыть ее, используйте

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
73 голосов
/ 02 декабря 2015

Когда ничего не работает, заставляет его показываться :

editText.requestFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY);
70 голосов
/ 09 ноября 2012

Следующий код разграблен из исходного кода Google 4.1 для SearchView. Кажется, работает, хорошо на меньших версиях Android.

private Runnable mShowImeRunnable = new Runnable() {
    public void run() {
        InputMethodManager imm = (InputMethodManager) getContext()
                .getSystemService(Context.INPUT_METHOD_SERVICE);

        if (imm != null) {
            imm.showSoftInput(editText, 0);
        }
    }
};

private void setImeVisibility(final boolean visible) {
    if (visible) {
        post(mShowImeRunnable);
    } else {
        removeCallbacks(mShowImeRunnable);
        InputMethodManager imm = (InputMethodManager) getContext()
                .getSystemService(Context.INPUT_METHOD_SERVICE);

        if (imm != null) {
            imm.hideSoftInputFromWindow(getWindowToken(), 0);
        }
    }
}

Затем, кроме того, необходимо добавить следующий код при создании элемента управления / действия. (В моем случае это составной элемент управления, а не действие).

this.editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
    public void onFocusChange(View v, boolean hasFocus) {
        setImeVisibility(hasFocus);
    }
});
30 голосов
/ 27 ноября 2012

android:windowSoftInputMode="stateAlwaysVisible" -> в файле манифеста.

edittext.requestFocus(); -> в коде.

Это откроет экранную клавиатуру, на которой редактируемый текст имеет фокус запроса при появлении активности.

27 голосов
/ 09 октября 2011

Мне немного повезло в некоторых простых случаях с приведенным ниже кодом.Я еще не закончил все тесты, но ....

EditText input = (EditText) findViewById(R.id.Input);
input.requestFocus();    
input.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN , 0, 0, 0));
input.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_UP , 0, 0, 0));

И до того, как появляется клавиатура.

14 голосов
/ 24 сентября 2014

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

...
dialog.show();
input.requestFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
9 голосов
/ 13 марта 2017

Чтобы скрыть клавиатуру, используйте эту:

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

и показать клавиатуру:

getActivity().getWindow().setSoftInputMode(
    WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
9 голосов
/ 15 января 2014

Иногда ответ Раукодрауга не работает.Я сделал это таким образом с некоторыми пробами и ошибками:

public static void showKeyboard(Activity activity) {
    if (activity != null) {
        activity.getWindow()
                .setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
    }
}

public static void hideKeyboard(Activity activity) {
    if (activity != null) {
        activity.getWindow()
                .setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
    }
}

И EditText часть:

    editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            if (!hasFocus) {
                hideKeyboard(getActivity());
            } else {
                showKeyboard(getActivity());
            }
        }
    });
...