我有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);
}
});
}
这个方法不是很糟糕,而且它有些不对劲。对话框的EditText
有inputType="numberDecimal"
。 closeInput()
似乎没有关闭键盘,只是将其更改为默认的字母状态。
这里发生了什么?
答案 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)
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)
找到了一种隐藏对话框键盘的简单方法
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)
}
}