при использовании 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.