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


117

Я використовую AlertDialog.Builder для створення вікна введення з методом введення 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!
Філіпп

Це справді рішення? Це просто змушує клавіатуру показувати, незалежно від того, є поле введення чи ні, незалежно, чи поле введення має фокус чи ні, правда? =)
Тед

@ Ти маєш рацію, це не справжнє рішення, але воно працює. Я намагався зробити таке, якщо в діалоговому вікні немає редагування тексту, а м'яка клавіатура не з’явилася.
grine4ka

1
Мені реально вдається «вирішити» (вирішення). Я використовую setOnFocusChangeListener для EditText, а в onFocusChange, якщо перевіряю, чи має фокус (вар "hasFocus"), і якщо так, я роблю getWindow (). SetSoftInputMode (WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISS_VIS)
Тед

1
Примітка. Щоб це працювало, потрібно розмістити setSoftInputModeрядок раніше, dialog.show() або він не працюватиме. +1 для простого правильного рішення btw
Spikatrix

29

Мені вдалося вирішити це так:

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. Так 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.

Це єдине рішення, яке працювало на мене, і я спробував НАВЧАННЯ з них. Шахта була побудовою діалогового фрагменту від будівельника alardialog. Важливим бітом здавалося, що це розміщення вищевказаного коду в onResume (). В іншому місці це просто не вийшло!
користувач960914

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) Замкніть об'єкти, для яких метод 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)
}

Java:

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
Краще включити деякий контекст / пояснення з кодом, оскільки це робить відповідь кориснішою для ОП та для майбутніх читачів.
EJoshuaS

0

Ця проблема виникає, коли EditText додається після виклику AlertDialog.onCreate.

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

Клас AlertDialog піклується про автоматичне встановлення для вас android.view.WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM на основі того, чи повертаються будь-які погляди в діалоговому вікні з 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.