如何通过setCanceledOnTouchOutside事件取消DialogFragment时隐藏屏幕键盘

JaR*_*Ray 10 android dialogfragment

如果当前正在关注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();
}
Run Code Online (Sandbox Code Playgroud)

但是,如果我尝试通过触摸对话片段之外取消它时同样的事情,它将无法工作.我试图通过覆盖onCancel来做到这一点:

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

当外部触摸事件发生时调用该函数,但不删除键盘.

小智 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;
}
Run Code Online (Sandbox Code Playgroud)

我尝试了许多替代方法,包括使用 DialogFragment 的 onCancel 和 onDimiss 侦听器,但均无济于事。我认为问题在于侦听器是异步调用的,而解雇/取消是同步处理的;因此,当您的侦听器被调用以隐藏键盘时,窗口令牌不再存在。


Kar*_*nan 0

尝试添加onDismissListener这样的。

dialog.setOnDismissListener(new DialogInterface.OnDismissListener() {

        @Override
        public void onDismiss(DialogInterface dialog) {
            // TODO Auto-generated method stub
            dismiss();
            }
        });
Run Code Online (Sandbox Code Playgroud)