如果编辑文本当前是关注的,并且用户在DialogFragment之外单击; 我想让屏幕键盘消失。 当DialogFragment以这种方式被解散时,我可以得到它的工作:
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之外的方法来取消同样的操作,它将不起作用。 我试图通过覆盖取消这样做:@Override public void onCancel(DialogInterface dialog){ imm.hideSoftInputFromWindow(getView().getWindowToken(), 0); super.onCancel(dialog); }
该function在外部触摸事件发生时被调用,但键盘未被移除。
这是我做了什么来做到这一点终于工作…我需要不使用键盘的小部件…但使用currentfocus得到的windowtoken删除键盘时,用户select的东西在对话框外…
@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听众无济于事。 我相信这个问题是侦听器是asynchronous调用的,而解除/取消是同步处理的。 所以当你的监听器被调用来隐藏键盘时,窗口标记不再存在。
我有同样的问题,并通过在AndroidManifest下生成DialogFragment来解决它:
android:windowSoftInputMode="stateHidden"
尝试像这样添加一个onDismissListener 。
dialog.setOnDismissListener(new DialogInterface.OnDismissListener() { @Override public void onDismiss(DialogInterface dialog) { // TODO Auto-generated method stub dismiss(); } });