Android 当SetCanceledOnTouchExtern事件取消对话框片段时,如何隐藏屏幕键盘

Android 当SetCanceledOnTouchExtern事件取消对话框片段时,如何隐藏屏幕键盘,android,dialogfragment,Android,Dialogfragment,如果edittext当前处于焦点,并且用户在DialogFragment之外单击;我希望屏幕上的键盘消失。当DialogFragment以这种方式被解除时,我可以让它工作: InputMethodManager imm; public View onCreateView(LayoutInflater inflator, ViewGroup container, Bundle savedInstanceState) { imm = (InputMethodManager)getAc

如果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();
}
但是,如果我在通过触摸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是什么?