Show soft keyboard for dialog

42,204

Solution 1

Awesome question, I was trying to do that too and found a solution.

Using the dialog builder class AlertDialog.Builder you will have to invoke the dialog like this:

AlertDialog.Builder builder = new AlertDialog.Builder();
AlertDialog dialog;

builder.set...

dialog = builder.create();
dialog.getWindow().setSoftInputMode(LayoutParams.SOFT_INPUT_STATE_VISIBLE);
dialog.show();

This worked fine for me.

Note: you must import android.view.WindowManager.LayoutParams; for the constant value there.

Solution 2

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

Solution 3

Kotlin

Here's the tested code.

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)

Make sure you access the window property from show() method. Getting window from create() method was returning null for me, so the keyboard wasn't showing.

Import AlertDialog from androidx.appcompat.app.AlertDialog. Import WindowManager from android.view.

Solution 4

Dialog Fragment With Kotlin

override onStart Method

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

if you want to close after dismiss then override dismiss method with below code

override fun onDismiss(dialog: DialogInterface?) {
val inputMethodManager = context?.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
        inputMethodManager.hideSoftInputFromWindow(activity?.currentFocus?.windowToken, InputMethodManager.HIDE_IMPLICIT_ONLY)
}
Share:
42,204

Related videos on Youtube

Rene
Author by

Rene

Updated on July 05, 2022

Comments

  • Rene
    Rene almost 2 years

    I am displaying a dialog with an edittext view. However, the softkeyboard will open only if the user presses inside the editview. So I tried calling an InputMethodManager with the following code.

    InputMethodManager imm =
     (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.showSoftInput(dialogField,0);
    

    The dialogField is the input field. However, when exactly am I supposed to do this? I tried it in the onStart() method of the dialog, but nothing happens. I also tried requesting the focus for the dialogField before, but that changes nothing.

    I also tried this code

    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);
                */
            }
        }
    });
    

    in both versions. But no soft keyboard would like to appear. The Main.log is just a log, which shows me that the function is actually called. And yes, it is called.

    I could get the keyboard with the SHOW_FORCED flag before the dialog opens. But then it will not close on exit. And I can only do that BEFORE I show the dialog. Inside any callbacks it does not work either.

    • Telmo Marques
      Telmo Marques over 13 years
      Have you tried the SHOW_IMPLICIT flag?
    • Thomas
      Thomas over 13 years
      This is something I have struggled with excessively but have been unable to get to work properly.
    • Rene
      Rene over 13 years
      Yes, I tried the SHOW_IMPLICIT flag. The documentation says exactly, that you should call showSoftInput, if the user is expected to do input for a TextEdit. But how?
    • Shawn Lauzon
      Shawn Lauzon almost 13 years
      This was answered here, and it works great for me.
  • Alex.F
    Alex.F over 9 years
    I do wonder how this affects the window behaviour after the dialog will close... let's not forget that the window contains the dialog and your activities as well
  • SparK
    SparK over 9 years
    This does not set the keyboard to an "always on" behaviour, this only triggers the open keyboard method while dialog is opening. Once user presses the "back key" or leaves the input field, keyboard will close again, like it normaly would.
  • Abbas
    Abbas over 6 years
    For anyone with the same issue note that setSoftInputMode() must be called before show().
  • abbasalim
    abbasalim over 6 years
    for me worked with 'SOFT_INPUT_STATE_ALWAYS_VISIBLE'
  • h3nr1ke
    h3nr1ke about 6 years
    not working for me, still opening the keyboard over the all the elements... using AlertDialogBuilder =(
  • Joel Broström
    Joel Broström almost 6 years
    Wow, thank you so much! Can we please add a donation or contribute button to SO for showing appreciation?
  • FreakyLearner
    FreakyLearner almost 4 years
    Dude you are amazing! That windows.cl3wrFlags line is important. I had checked every SO answer and that line wasn't mentioned anywhere else. Thanks man!
  • Nekomajin42
    Nekomajin42 over 3 years
    FINALLY an answer! For anyone, who wants to use it from a custom dialog class, just call getWindow().setSoftInputMode(LayoutParams.SOFT_INPUT_STATE_V‌​ISIBLE); from the onCreate() method.
  • gmk57
    gmk57 over 3 years
    Please be aware that calling dialog.getWindow().setSoftInputMode() after dialog.show() on Android 4-8 has a nasty side effect: dialog remains on screen after configuration changes, still tied to already destroyed Activity/Fragment.
  • Hank Chan
    Hank Chan about 2 years
    When you have a list, a pager or other view that uses an adapter (which is nesting the edittext) on a dialog, AlertDialog is setting these flags so no soft input will be triggered. Just clear the flags and set the soft input mode.