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

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

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

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

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

Ответы [ 35 ]

6 голосов
/ 27 июня 2014

showSoftInput у меня вообще не работал.

Я решил, что мне нужно установить режим ввода: (здесь, в компоненте Activity в манифесте)

android:windowSoftInputMode="stateVisible" 
6 голосов
/ 10 мая 2017

Для фрагмента, убедитесь, что он работает:

 displayName = (EditText) view.findViewById(R.id.displayName);
    InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
5 голосов
/ 03 октября 2016

Я здесь все объединил и у меня все работает:

public static void showKeyboardWithFocus(View v, Activity a) {
    try {
        v.requestFocus();
        InputMethodManager imm = (InputMethodManager) a.getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.showSoftInput(v, InputMethodManager.SHOW_IMPLICIT);
        a.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
    } catch (Exception e) {
        e.printStackTrace();
    }
}
5 голосов
/ 04 января 2017
editText.post(new Runnable() {
    @Override
    public void run() {
        InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);
    }
});
5 голосов
/ 25 сентября 2013

У меня была одна и та же проблема в разных ситуациях, и решения, которые я нашел, работали в некоторых, но не работали в других, поэтому вот комбинированное решение, которое работает в большинстве ситуаций, которые я нашел:

public static void showVirtualKeyboard(Context context, final View view) {
    if (context != null) {
        final InputMethodManager imm =  (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
        view.clearFocus();

        if(view.isShown()) {
            imm.showSoftInput(view, 0);
            view.requestFocus();
        } else {
            view.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() {
                @Override
                public void onViewAttachedToWindow(View v) {
                    view.post(new Runnable() {
                        @Override
                        public void run() {
                            view.requestFocus();
                            imm.showSoftInput(view, 0);
                        }
                    });

                    view.removeOnAttachStateChangeListener(this);
                }

                @Override
                public void onViewDetachedFromWindow(View v) {
                    view.removeOnAttachStateChangeListener(this);
                }
            });
        }
    }
}
4 голосов
/ 02 июня 2016

фрагмент кода.,.

public void hideKeyboard(Context activityContext){

    InputMethodManager imm = (InputMethodManager)
            activityContext.getSystemService(Context.INPUT_METHOD_SERVICE);

    //android.R.id.content ( http://stackoverflow.com/a/12887919/2077479 )
    View rootView = ((Activity) activityContext)
            .findViewById(android.R.id.content).getRootView();

    imm.hideSoftInputFromWindow(rootView.getWindowToken(), 0);
}

public void showKeyboard(Context activityContext, final EditText editText){

    final InputMethodManager imm = (InputMethodManager)
            activityContext.getSystemService(Context.INPUT_METHOD_SERVICE);

    if (!editText.hasFocus()) {
        editText.requestFocus();
    }

    editText.post(new Runnable() {
        @Override
        public void run() {
            imm.showSoftInput(editText, InputMethodManager.SHOW_FORCED);
        }
    });
}
4 голосов
/ 24 января 2012

Поверьте или нет, моя проблема с Soft Keyboard была решена, когда я обнаружил, что анимация Activity может отключить Soft Keyboard. Когда вы называете намерение с

i.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);

и

overridePendingTransition(0, 0);

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

4 голосов
/ 25 марта 2017

Это сработало для меня. Вы также можете попробовать показать клавиатуру:

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
3 голосов
/ 23 октября 2018

А для Kotlin просто используйте следующие расширения:

fun EditText.showKeyboard() {
    val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    imm.showSoftInput(this, InputMethodManager.SHOW_IMPLICIT)
}

fun EditText.hideKeyboard() {
    val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    imm.hideSoftInputFromWindow(this.windowToken, 0)
}
3 голосов
/ 17 января 2015
final InputMethodManager keyboard = (InputMethodManager) ctx.getSystemService(Context.INPUT_METHOD_SERVICE);
keyboard.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);
...