Hide to show and hide keyboard in DialogFragment

后端 未结 8 2191
花落未央
花落未央 2021-02-08 03:57

In my dialog fragment, I am able to show the keyboard using

getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT STATE_VISIBLE);


        
相关标签:
8条回答
  • 2021-02-08 04:34

    I had extension for fragment, but didn't work with dialog fragment. This extension works for both (not tested much tho)

    /**
     * If no window token is found, keyboard is checked using reflection to know if keyboard visibility toggle is needed
     *
     * @param useReflection - whether to use reflection in case of no window token or not
     */
    fun Fragment.hideKeyboard(context: Context = App.instance, useReflection: Boolean = true) {
        val windowToken = view?.rootView?.windowToken
        val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
        windowToken?.let {
            imm.hideSoftInputFromWindow(windowToken, 0)
        } ?: run {
            if (useReflection) {
                try {
                    if (getKeyboardHeight(imm) > 0) {
                        imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS)
                    }
                } catch (exception: Exception) {
                    Timber.e(exception)
                }
            }
        }
    }
    
    fun getKeyboardHeight(imm: InputMethodManager): Int = InputMethodManager::class.java.getMethod("getInputMethodWindowVisibleHeight").invoke(imm) as Int
    

    Edit: toggle opened keyboard if it was closed before, I use reflection to get keyboard's height, which is not best solution, but works

    0 讨论(0)
  • 2021-02-08 04:42

    Kotil Extension function for DialogFragment hide keyboard

     use : hideKeyboard(view)
    
    fun DialogFragment.hideKeyboard(view: View) {
        val imm =view.context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
        imm.hideSoftInputFromWindow(view.windowToken, 0)
    }
    
    0 讨论(0)
  • 2021-02-08 04:43

    I found only one fully working approach if you want to show keyboard when dialog is shown and hide keyboard when dialog is dismissed

    <style name="InputDialog" parent="ThemeOverlay.AppCompat.Dialog.Alert">
        <item name="android:windowSoftInputMode">stateAlwaysVisible</item>
    </style>
    

    And then you should use the theme above inside your DialogFragment

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setStyle(STYLE_NORMAL, R.style.InputDialog)
    }
    
    0 讨论(0)
  • 2021-02-08 04:52

    Hiding keyboard in a View inside DialogFragment:

    public static void hideKeyboardInAndroidFragment(View view){
            final InputMethodManager imm = (InputMethodManager) view.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
    }
    
    0 讨论(0)
  • 2021-02-08 04:53

    for hide soft keyboard, you can use this method:

    public void hideSoftKeyboard() {
            try {
                View windowToken = getDialog().getWindow().getDecorView().getRootView();
                InputMethodManager imm = (InputMethodManager) getDialog().getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
                imm.hideSoftInputFromWindow( windowToken.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
            } catch (Exception ex) {
                Log.e(ex);
            }
        }
    
    0 讨论(0)
  • 2021-02-08 04:55

    Hide it in DialogFragment onDestroyView() method:

     View view = getActivity().getCurrentFocus();
            if (view == null) view = new View(activity);
            InputMethodManager imm = (InputMethodManager)     getActivity().getSystemService(Activity.INPUT_METHOD_SERVICE);
            if (imm == null) return;
            imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
    

    maybe work.

    0 讨论(0)
提交回复
热议问题