Показати програмну клавіатуру для діалогу


77

Я відображаю діалогове вікно з поданням редагування тексту. Однак програмна клавіатура відкриється, лише якщо користувач натисне всередині редагування. Тому я спробував зателефонувати 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 перед тим, як відкриється діалогове вікно. Але тоді він не закриється на виході. І я можу це зробити ПЕРЕД тим, як показати діалогове вікно. Усередині зворотних викликів він теж не працює.


Ви пробували прапор SHOW_IMPLICIT?
Telmo Marques

1
Це те, з чим я боровся надмірно, але не зміг нормально приступити до роботи.
Томас

Так, я спробував позначити SHOW_IMPLICIT. У документації точно сказано, що вам слід викликати showSoftInput, якщо від користувача очікується введення для TextEdit. Але як?
Рене,

Тут відповіли на це , і це чудово для мене працює.
Шон Лоузон,

Відповіді:


184

Чудове запитання, я теж намагався це зробити і знайшов рішення.

За допомогою класу конструктора діалогів 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;для постійного значення потрібно.


1
Мені цікаво, як це впливає на поведінку вікна після закриття діалогового вікна ... не забуваємо, що вікно містить діалогове вікно та ваші дії також
Alex.F

4
Для тих, хто має ту саму проблему, зверніть увагу на те, що setSoftInputMode()потрібно телефонувати раніше show().
Аббас

2
для мене працював із 'SOFT_INPUT_STATE_ALWAYS_VISIBLE'
abbasalim

2
Ого, дякую тобі! Чи можемо ми, будь ласка, додати пожертву або внести кнопку до SO для висловлення вдячності?
Joel Broström

1
Нарешті відповідь! Для всіх, хто хоче використовувати його із власного діалогового класу, просто зателефонуйте getWindow().setSoftInputMode(LayoutParams.SOFT_INPUT_STATE_VISIBLE);із onCreate()методу.
Nekomajin42

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

1
Чувак ти дивовижний! Важливим є те, що рядок windows.cl3wrFlags. Я перевірив кожну відповідь SO, і цей рядок більше ніде не згадувався. Дякую людино!
FreakyLearner

6

Котлін

Ось перевірений код.

val dialog = AlertDialog.Builder(requireContext()).apply {
    setTitle(…)
    setView(editText)
    setPositiveButton(…)
    setNegativeButton(…)
}
val window = dialog.show().window
window?.clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE or WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM)
window?.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE)

Переконайтеся, що ви отримали доступ до windowвластивості з show()методу. Отримання windowвід create()методу повертається nullдля мене, так що клавіатура не показувала.

Імпорт AlertDialogз androidx.appcompat.app.AlertDialog. Імпорт WindowManagerз android.view.


0

Фрагмент діалогу з Котліним

перевизначити метод onStart

override fun onStart() {
    super.onStart()
    dialog.window?.
    setSoftInputMode(
    WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE
    )
}

якщо ви хочете закрити після звільнення, замініть метод звільнення наведеним нижче кодом

override fun onDismiss(dialog: DialogInterface?) {
val inputMethodManager = context?.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
        inputMethodManager.hideSoftInputFromWindow(activity?.currentFocus?.windowToken, InputMethodManager.HIDE_IMPLICIT_ONLY)
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.