场景:自定义了一个Dialog,Dialog里面包含EditText,当输入时手机键盘会弹出,但是点击空白区域Dialog关闭时键盘不会自动隐藏。
之前也自定义过一个Dialog,里面也是包含EditText,不过因为这个Dialog占地方比较大,当弹出键盘时已经没有空白区域可以点击,所以在Dialog上添加了一个关闭按钮,然后调用下面方法:
public static void hideSoftKeyboard(Activity context, View view) {
InputMethodManager imm = (InputMethodManager) context
.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
这样Dialog关闭后键盘都可以自动收起,但是最近做的一个Dialog,当弹出键盘后点击空白区域Dialog关闭了但是键盘还是没有收起!!! 通过不断的尝试发现了另外一个方法:
首先我们监听Dialog的关闭方法,然后调用收起键盘的方法。
this.setOnDismissListener(new OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog) {
// TODO Auto-generated method stub
InputMethodManager inputMgr = (InputMethodManager) context
.getSystemService(Context.INPUT_METHOD_SERVICE);
inputMgr.toggleSoftInput(InputMethodManager.HIDE_NOT_ALWAYS, 0);
}
});
这样当点击空白区域关闭Dialog的时候,键盘也可以收起了。不过这个方法有个弊端就是如果键盘没有弹出的话就会弹出键盘。。。(好坑), 而且判断键盘是否弹出的方法inputMgr.isActive()会一直返回true。。最后没办法只能通过重写父布局,这我是重写的RelativeLayout,通过onSizeChanged(int w, int h, int oldw, int oldh)和onLayout(boolean changed, int l, int t, int r, int b)方法来判断键盘是否弹出,最后调用上面的方法解决。
这里再提个自定义Dialog需要注意的问题:当我们给Dialog自定义布局的时候会发现即使我们没有设置背景,会发现Dialog的背景为白色,一般我们需要的是透明。这里在自定义的时候需要在代码里加入:
Window dialogWindow = getWindow();
WindowManager.LayoutParams lp = dialogWindow.getAttributes();
dialogWindow.setBackgroundDrawableResource(.R.color.transparent);
DisplayMetrics d = context.getResources().getDisplayMetrics();
lp.width = (int) (d.widthPixels * 0.6);
dialogWindow.setAttributes(lp);