10

如果一个edittext当前被聚焦并且用户在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();
}

但是,如果我在通过触摸对话框片段外部取消它时尝试相同的操作,它将不起作用。我试图通过像这样覆盖 onCancel 来做到这一点:

@Override
public void onCancel(DialogInterface dialog){
    imm.hideSoftInputFromWindow(getView().getWindowToken(), 0);
    super.onCancel(dialog);
}

当外部触摸事件发生时调用该函数,但键盘没有被移除。

4

4 回答 4

5

在执行对话框上的取消代码之前,我可以通过对对话框进行子类化并隐藏键盘来解决相同的问题。

@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 侦听器均无济于事。我认为问题在于,在同步处理解除/取消时,异步调用了侦听器;因此,当您的侦听器被调用以隐藏键盘时,窗口令牌不再存在。

于 2014-05-05T16:27:23.323 回答
1

这就是我为使其最终工作所做的工作...我不需要将小部件用于键盘...但是当用户在对话框之外选择某些内容时,使用 currentfocus 获取窗口令牌以删除键盘...

@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();
}
于 2014-03-07T16:59:27.020 回答
1

我遇到了同样的问题,并通过将其放在生成 DialogFragment 的活动下的 AndroidManifest 中来解决它:

android:windowSoftInputMode="stateHidden"
于 2014-05-09T17:03:31.703 回答
0

尝试添加onDismissListener这样的。

dialog.setOnDismissListener(new DialogInterface.OnDismissListener() {

        @Override
        public void onDismiss(DialogInterface dialog) {
            // TODO Auto-generated method stub
            dismiss();
            }
        });
于 2013-04-29T01:05:49.380 回答