Android 当SetCanceledOnTouchExtern事件取消对话框片段时,如何隐藏屏幕键盘
如果edittext当前处于焦点,并且用户在DialogFragment之外单击;我希望屏幕上的键盘消失。当DialogFragment以这种方式被解除时,我可以让它工作:Android 当SetCanceledOnTouchExtern事件取消对话框片段时,如何隐藏屏幕键盘,android,dialogfragment,Android,Dialogfragment,如果edittext当前处于焦点,并且用户在DialogFragment之外单击;我希望屏幕上的键盘消失。当DialogFragment以这种方式被解除时,我可以让它工作: InputMethodManager imm; public View onCreateView(LayoutInflater inflator, ViewGroup container, Bundle savedInstanceState) { imm = (InputMethodManager)getAc
InputMethodManager imm;
public View onCreateView(LayoutInflater inflator, ViewGroup container,
Bundle savedInstanceState) {
imm = (InputMethodManager)getActivity().getSystemService(Activity.INPUT_METHOD_SERVICE);
...}
@Override
public void dismiss(){
imm.hideSoftInputFromWindow(getView().getWindowToken(), 0);
super.dismiss();
}
但是,如果我在通过触摸dialogfragment外部取消它时尝试相同的操作,它将不起作用。我试图通过如下方式覆盖onCancel来实现这一点:
@Override
public void onCancel(DialogInterface dialog){
imm.hideSoftInputFromWindow(getView().getWindowToken(), 0);
super.onCancel(dialog);
}
当外部触摸事件发生时,会调用该函数,但不会移除键盘 试着像这样添加一个
onDismissListener
dialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog) {
// TODO Auto-generated method stub
dismiss();
}
});
这就是我所做的让它最终起作用。。。我不需要在键盘上使用小部件。。。但是当用户在对话框外选择某个内容时,使用currentfocus获取windowtoken以删除键盘
@Override
public void onStop() {
// make sure the keyboard goes away when the user selects something outside the view (cancelled outside)
if( Utilities.isValidActivity(this.getActivity())) {
InputMethodManager imm = (InputMethodManager)this.getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
// not the search view but the current focus at this point
imm.hideSoftInputFromWindow(this.getActivity().getCurrentFocus().getWindowToken(), 0);
}
super.onStop();
}
我能够解决同样的问题,在执行对话框上的取消代码之前,对对话框进行子分类并隐藏键盘
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Dialog dialog = new Dialog(getActivity(), getTheme()) {
@Override public void cancel() {
if (getActivity() != null && getView() != null) {
InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getView().getWindowToken(), 0);
}
super.cancel();
}
};
return dialog;
}
我尝试了许多替代方法,包括使用DialogFragment的onCancel和onDimiss侦听器,但都无济于事。我认为问题在于侦听器是异步调用的,而discouse/cancel是同步处理的;因此,当您的侦听器被调用隐藏键盘时,窗口标记不再存在。我也遇到了同样的问题,并通过将其放入生成DialogFragment的活动下的AndroidManifest中解决了这个问题:
android:windowSoftInputMode="stateHidden"
我喜欢这个想法,但它不起作用。事实上,如果touch outside事件取消了DialogFragment,则OnDissmissListener将被忽略。我知道当触摸外部事件发生时会调用onCancel,但是hideSoftInputFromWindow在这种情况下不会做任何事情。哪个视图调用键盘?使用调用键盘的实际小部件来关闭它,而不是
getView()
。我没有使用实际的小部件,因为屏幕上有多个edittext小部件。然而,我选择了一个来尝试你的建议,但它仍然不起作用。事实上,onDismissListener完全被跳过了。以下是我在DialogFragment的onCreateView中添加的内容:this.getDialog().setOnDismissListener(新DialogInterface.OnDismissListener(){@Override public void onDismiss(DialogInterface arg0){disease();}});即使发生SetCanceledOnTouchOut,也不会调用此侦听器。您需要在对话框片段中重写onDismiss()
方法,并从中隐藏键盘。这会导致相同的问题,调用cancel(),但ime保持打开状态。这是唯一有帮助的方法。好极了!请注意,hideSoftInputFromWindow()(这对我来说一直有效。谢谢。虽然我不知道你在用实用程序类做什么检查?你说的isValidActivity是什么意思?isValidActivity是什么?