如何在对话框关闭时隐藏键盘

时间:2013-04-19 14:03:05

标签: android android-softkeyboard android-keypad

我有Activity个单Fragment就可以了。片段上有一个EditText

显示片段后键盘弹出,但我设法在清单android中阻止它设置:windowSoftInputMode =“stateHidden”

但是,还有一个按钮,用于打开另一个EditText的对话框。

我有一个方法可以在对话框关闭时自动关闭键盘。

public static void closeInput(final View caller) {      
    caller.post(new Runnable() {
        @Override
        public void run() {
            InputMethodManager imm = (InputMethodManager) caller.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(caller.getWindowToken(), InputMethodManager.HIDE_IMPLICIT_ONLY);
        }
    });
}

这个方法不是很糟糕,而且它有些不对劲。对话框的EditTextinputType="numberDecimal"closeInput()似乎没有关闭键盘,只是将其更改为默认的字母状态。

这里发生了什么?

7 个答案:

答案 0 :(得分:13)

在我的情况下,我使用了方法:

public static void closeInput(final View caller) {  
    caller.postDelayed(new Runnable() {
        @Override
        public void run() {
            InputMethodManager imm = (InputMethodManager) caller.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(caller.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
        }
    }, 100);
}

由于Manifest中的活动设置,我拒绝正常工作,如果我记得你不能设置android:windowSoftInputMode="any_of_these"

答案 1 :(得分:7)

从片段onCreateView()方法,你可以这样做:

getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN)
  

它会在Dismiss of Dialog

上自动隐藏软键盘

答案 2 :(得分:5)

BaseDialog.java中的

protected void hideSoftKeyboard() {
    InputMethodManager imm = (InputMethodManager) this.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
    if (imm.isActive()) {
        imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);
    }
}

答案 3 :(得分:1)

在我的情况下,解决方案是将键盘隐藏在对话框中解除

dialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
        @Override
        public void onDismiss(DialogInterface dialog) {
            View view = activity.getCurrentFocus();
            if (view != null) {
                InputMethodManager inputManager = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
                inputManager.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
            }
        }
    }); 

答案 4 :(得分:1)

在这个问题上苦苦挣扎,在回顾这里的答案后,大多数似乎确实有效。由于 不希望使用类而不仅仅是构建器 ,因此答案https://stackoverflow.com/a/36422411/1815624不是一个可行的解决方案。

认识其他人可能会遇到同样的问题,答案来自两者: https://stackoverflow.com/a/17393446/1815624& https://stackoverflow.com/a/32648971/1815624

所以组合答案是从片段本身抓取视图:

(任何人都有理由不去?)

void closeKeyboard(final View caller){
    caller.post(new Runnable() {
        @Override
        public void run() {
            InputMethodManager imm = (InputMethodManager) caller.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(caller.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
        }
    });
}

...

dialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
    @Override
    public void onDismiss(DialogInterface dialog) {
        closeKeyboard(getView());
    }
});

答案 5 :(得分:1)

我使用的是:

android:windowSoftInputMode="adjustPan|stateVisible"

我删除了stateVisible

android:windowSoftInputMode="adjustPan"

还有onDismiss(),无需调用hideSoftInput方法。

答案 6 :(得分:0)

找到了一种隐藏对话框键盘的简单方法

  1. dialog.setCanceledOnTouchOutside(false)
  2. 调用 hideKeyboardFromDialogBeforeDismiss() 对话框关闭前,可能是在取消按钮点击事件上,不应在 onDismiss 或 onCancelListener 中调用
    binding.cancelBtn.setOnClickListener {       
        STSystemUtil.hideKeyboardFromDialogBeforeDismiss(dialog = dialog) 
        binding.root.postDelayed({ dialog?.dismiss() }, 200)
    }
    
    @JvmStatic
    @JvmOverloads
    fun getInputMethodManager(context: Context? = STInitializer.application()): InputMethodManager? {
        return context?.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager?
    }

    /*
     * 注意: 如果 dialog 包含一个或者多个EditText, 点击外部(canceledOnTouchOutside==true)不会隐藏已经显示的输入法弹框, 且通过点击取消按钮必须先隐藏输入法弹框再延时 dismiss, 因为在 onCancel/onDismiss 中 dialog?.currentFocus?.windowToken 必然已经是 null, 且 inputMethodManager?.isActive 必然是 false
     * ----> canceledOnTouchOutside = false
     * ----> binding.cancelBtn.setOnClickListener {
     *          STSystemUtil.hideKeyboardFromDialogBeforeDismiss(dialog)
     *          binding.root.postDelayed({ dialog?.dismiss() }, 200)
     *       }
     */
    @JvmStatic
    @JvmOverloads
    fun hideKeyboardFromDialogBeforeDismiss(context: Context? = STInitializer.application(), dialog: Dialog? = null) {
        val inputMethodManager: InputMethodManager? = getInputMethodManager(context)
        if (dialog == null) {
            if (inputMethodManager?.isActive == true) {
                inputMethodManager.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS)
            }
        } else {
            inputMethodManager?.hideSoftInputFromWindow(dialog.currentFocus?.windowToken, InputMethodManager.HIDE_NOT_ALWAYS)
        }
    }