Android: как закрыть явно отображаемую программную клавиатуру? - PullRequest
1 голос
/ 16 марта 2011

Я показываю диалог для ввода текста и хотел бы автоматически отображать программную клавиатуру, если жесткая клавиатура не открыта. Чтобы отобразить его на вкладке Samsung Galaxy Tab, мне пришлось использовать флаг SHOW_FORCED, флаг SHOW_IMPLICIT не работал. Кроме того, при закрытии диалога я бы хотел закрыть клавиатуру, если принудительно ее отобразил. Однако код, который я использую ниже, не закрывает клавиатуру на моем Galaxy Tab; Я предполагаю, что это потому, что я использовал флаг Explicit, чтобы показать.

    /* from the dialog constructor*/

    InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.restartInput(mEditText);

    //only display if there is no hard keyboard out 
    Configuration config = getResources().getConfiguration();
    if (config.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_YES)
    {
      mForcedKeyboardDisplay = true;
      imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
    }


    /* from the onDismiss() method*/

    //if we previously forced keyboard display, force it to close
    if (mForcedKeyboardDisplay)
    {
       InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
       imm.restartInput(mEditText);

       imm.hideSoftInputFromWindow(mEditText.getWindowToken(), InputMethodManager.HIDE_IMPLICIT_ONLY);
       //this doesn't work either 
       //imm.hideSoftInputFromWindow(mEditText.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
       //nor does this
       //imm.hideSoftInputFromWindow(mEditText.getWindowToken(), 0);
    }

1 Ответ

4 голосов
/ 17 марта 2011

Во-первых, не используйте toggleSoftInput().Это делает то, что говорит название - переключает состояние IME.Если вы действительно хотите, чтобы он был отображен, используйте showSoftInputFromWindow().

Во-вторых, нет причин для вызова restartInput().

Вызов showSoftInput() с флагом 0это именно то, что делает фреймворк, когда вы нажимаете на текстовое представление, чтобы показать IME.На самом деле вот код: https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/widget/TextView.java

Если вы можете отобразить IME, нажав на текстовое представление, но ваш собственный вызов не работает, вам действительно нужно выяснить, почему ваш вызовне работает.Я настоятельно рекомендую НЕ использовать SHOW_FORCED - это имеет несколько особенное поведение, которое, я сомневаюсь, вы хотите.(Например, если пользователь нажимает кнопку «Домой», IME остается открытым. Обычно это нежелательно.)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...