Показать программную клавиатуру для диалога - PullRequest
65 голосов
/ 23 ноября 2010

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

InputMethodManager imm =
 (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(dialogField,0);

dialogField является полем ввода.Однако когда именно я должен это сделать?Я попробовал это в методе onStart () диалога, но ничего не происходит.Я также пытался запросить фокус для dialogField ранее, но это ничего не меняет.

Я также пробовал этот код

dialogField.setOnFocusChangeListener(new View.OnFocusChangeListener()
{
    public void onFocusChange (View v, boolean hasFocus)
    {
        if (hasFocus)
        {
            Main.log("here");
            dialogInput.getWindow().setSoftInputMode(
              WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
            /*
                InputMethodManager mgr =
                  (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                mgr.showSoftInput(dialogField,0);
            */
        }
    }
});

в обеих версиях.Но ни одна мягкая клавиатура не хотела бы появляться.Main.log - это просто журнал, который показывает мне, что функция на самом деле вызывается.И да, это называется.

Я мог бы получить клавиатуру с флагом SHOW_FORCED, прежде чем откроется диалоговое окно.Но тогда он не закроется при выходе.И я могу сделать это только ДО того, как покажу диалог.Внутри любых обратных вызовов это тоже не работает.

Ответы [ 3 ]

162 голосов
/ 24 октября 2013

Удивительный вопрос, я тоже пытался это сделать и нашел решение.

Используя класс построителя диалогов AlertDialog.Builder, вам придется вызывать диалог следующим образом:

AlertDialog.Builder builder = new AlertDialog.Builder();
AlertDialog dialog;

builder.set...

dialog = builder.create();
dialog.getWindow().setSoftInputMode(LayoutParams.SOFT_INPUT_STATE_VISIBLE);
dialog.show();

Это сработало для меня.

Примечание: вы должны import android.view.WindowManager.LayoutParams; для постоянного значения там.

4 голосов
/ 02 июля 2018
 AlertDialog dialog = new AlertDialog.Builder(this).create();
    dialog.show();
    Window window = dialog.getWindow();
    window.clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
    window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
0 голосов
/ 24 ноября 2010

Это кажется невозможным.

Поэтому я сделал новое занятие вместо диалога и позволил пользователю редактировать там.Обратите внимание, что в действиях вы можете установить режим клавиатуры в файле манифеста.Я установил его на показ при открытии активности.

Также обратите внимание, что при тестировании на эмуляторе с жесткими клавишами клавиатура SHOW_IMPLICIT или флаг 0 не открывается.

...