при использовании AlertDialog.Builder с EditText программная клавиатура не появляется


117

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

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

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

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

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

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

Спасибо!!


1
пожалуйста, отформатируйте исходный код.
— Филипп

Тогда я тоже поддерживаю вас :) У меня была та же проблема с поиском в течение нескольких часов, и последний ответ от grine4ka отлично работает
— philipp

Ответы:


222

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

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

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

dialog.show();

3
Огромное спасибо. Я искал некоторое время, и это тот путь, которым вы хотите пойти. Все OnFocusChangeListenerподходы мне кажутся излишне сложными. Вы должны создать AlertDialogиз AlertDialog.Builder!
— Филипп

Это действительно решение? Это просто заставляет клавиатуру отображаться, независимо от того, есть ли поле ввода или нет, независимо от того, имеет ли поле ввода фокус или нет, верно? =)
— Тед

@Ted, вы правы, это не настоящее решение, но оно работает. Я пытался сделать это, если в диалоговом окне нет текста редактирования, а программная клавиатура не появлялась.
— grine4ka

1
Мне действительно удается «решить это» (обходной путь). Я использую setOnFocusChangeListener для EditText и в onFocusChange, если проверяю, есть ли у него фокус (переменная hasFocus), и если да, я использую getWindow (). SetSoftInputMode (WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
— Тед

1
Примечание: чтобы это сработало, вам нужно разместить setSoftInputModeлинию раньше, dialog.show() иначе она не сработает. +1 за простое правильное решение, кстати
— Spikatrix

30

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

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);

Это сработало для меня.
— Ахмад Дауду Сулейман

23

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

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

AlertDialog d = builder.create();
d.getWindow().setSoftInputMode(
    WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
d.show();

Спасибо. Это должно быть лучше, чем использование SOFT_INPUT_STATE_ALWAYS_VISIBLE. As SOFT_INPUT_STATE_ALWAYS_VISIBLEбудет блокировать компоненты пользовательского интерфейса диалога, где SOFT_INPUT_ADJUST_RESIZEможно изменять размер и «подталкивать» диалог.
— Cheok Yan Cheng

10

В моем случае единственный способ показать клавиатуру при отображении диалогового окна - это добавить в мои 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.

Это было единственное решение, которое сработало для меня, и я пробовал их ЗАГРУЗИТЬ. Мой был сборкой диалогового фрагмента от alerttdialog builder. Важным моментом, казалось, было размещение приведенного выше кода в onResume (). В другом месте это просто не сработало!
— user960914

6

Когда вы вызываете 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

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

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

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


Это сработало для меня, другое решение привлекало внимание, но клавиатура не отображалась.
— Акшай

2
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

Здесь уже был дан ответ . У меня сработало использование OnFocusChangeListener.


Вопрос спрашивает, как установить режим мягкого ввода для объекта AlertDialog.Builder, однако поток, на который вы ссылаетесь, дает пример с использованием объекта AlertDialog. Если я попытаюсь использовать предложенный код (с помощью alert.getWindow (). SetSoftInputMode (...) в OnFocusChangeListener) объекты Eclipse, метод getWindow () не определен для типа AlertDialog.Builder. Помогите мне исправить это, пожалуйста?
— Prepbgg

1

В моем случае SoftInputMode не отображался, когда я устанавливал его, который был до отображения диалога (после его создания). Приведенный ниже код работал у меня, где я установил SoftInputMode после отображения диалога.

Котлин:

val dialog = MaterialAlertDialogBuilder(context) // Other builder code
                .create()
dialog.show()
dialog.window?.apply { // After the window is created, get the SoftInputMode
    clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE)
    clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM)
    setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE)
}

Ява:

AlertDialog dialog = MaterialAlertDialogBuilder(getContext()) // Other builder code
                .create();
dialog.show();
Window window = dialog.getWindow();
if(window != null){ // After the window is created, get the SoftInputMode
    window.clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);
    window.clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
    window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
}

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


0

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

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

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);

0
final AlertDialog.Builder alert = new AlertDialog.Builder(context);

final AlertDialog dialog = alert.show();
dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);

1
Лучше включить в код некоторый контекст / объяснение, так как это сделает ответ более полезным для OP и для будущих читателей.
— EJoshuaS

0

Эта проблема возникает, когда EditText добавляется после вызова AlertDialog.onCreate.

https://developer.android.com/reference/androidx/appcompat/app/AlertDialog.Builder

Класс AlertDialog заботится об автоматической установке android.view.WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM в зависимости от того, возвращают ли какие-либо представления в диалоговом окне значение true из View.onCheckIsTextEditor ().

Вам необходимо снять флаг FLAG_ALT_FOCUSABLE_IM.

getWindow().clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM); 

Поскольку AlertDialog.show вызывается в DialogFragment.onStart, вы можете вставить код в DialogFragment.onStart.

@Override
public void onStart() {
    super.onStart();
    getDialog().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
}

Или вы можете использовать Dialog.setOnShowListener, если вы не используете DialogFragment.

dialog.setOnShowListener(new DialogInterface.OnShowListener() {
    @Override
    public void onShow(DialogInterface dialog) {
        getDialog().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
    }
});
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.