при использовании AlertDialog.Builder с EditText программная клавиатура не появляется - PullRequest
110 голосов
/ 11 августа 2010

Я использую AlertDialog.Builder , чтобы создать поле ввода с EditText в качестве метода ввода.

К сожалению, мягкая клавиатура не появляется, хотя EditText находится в фокусе, если вы не коснетесь ее снова.

Есть ли способ заставить его всплыть?

Я пробовал следующее, после (AlertDialog.Builder) .show (); , но безрезультатно.

InputMethodManager mgr = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
mgr.showSoftInput(input, InputMethodManager.SHOW_FORCED);

Кто-нибудь может помочь?

Спасибо !!

Ответы [ 10 ]

215 голосов
/ 20 июля 2011

Я сделал такую ​​вещь

AlertDialog.Builder b = new AlertDialog.Builder(this);//....
AlertDialog dialog = b.create();

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

dialog.show();
25 голосов
/ 07 июня 2013

Мне удалось решить это так:

Dialog = builder.create();
Dialog.show();
Dialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE  | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
Dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
22 голосов
/ 20 мая 2014

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

Я использую это, чувствует себя намного чище.

AlertDialog d = builder.create();
d.getWindow().setSoftInputMode(
    WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
d.show();
7 голосов
/ 16 сентября 2017

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

@Override
public void onResume() {
    super.onResume();
    getDialog().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
    getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
    myEditText.requestFocus();
}

Обратите внимание на SOFT_INPUT_STATE_ALWAYS_VISIBLE вместо SOFT_INPUT_STATE_VISIBLE .

Из документации:

int SOFT_INPUT_STATE_ALWAYS_VISIBLE
Visibility state for softInputMode: please always make the soft input area visible when this window receives input focus.
6 голосов
/ 26 января 2011

Когда вы вызываете showDialog, чтобы показать диалог, созданный с помощью AlertDialog в onCreateDialog

Вы должны поставить код здесь

    @Override
protected void onPrepareDialog (int id, Dialog dialog, Bundle args)
{
    TextView editText=(TextView) dialog.findViewById(R....);

    editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
       @Override
       public void onFocusChange(View v, boolean hasFocus) {
         if (hasFocus) {
            dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
         }
       }
    });

}
5 голосов
/ 31 мая 2013

Гораздо лучшее решение дано здесь .

dialog.getWindow().clearFlags(
         WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
        |WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);

Никакого обходного пути.EditText ведет себя как ожидалось.

2 голосов
/ 12 мая 2016
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);
1 голос
/ 09 сентября 2010

На этот вопрос уже ответили здесь уже. Использование OnFocusChangeListener сработало для меня.

0 голосов
/ 08 января 2017
final AlertDialog.Builder alert = new AlertDialog.Builder(context);

final AlertDialog dialog = alert.show();
dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
0 голосов
/ 30 марта 2016

Попробуйте, это работает для меня

Если вы хотите отобразить программную клавиатуру:

InputMethodManager imm = (InputMethodManager)getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
                    imm.showSoftInput(input.getWindowToken(), 0);

И если вы хотите скрыть это:

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