最近在项目开发的时候,测试给提了这样一个bug:弹出的对话框关闭后,键盘不隐藏。这里说明一下,因为弹出框有EditText,所以会弹出键盘。起初看到这个问题的时候,觉得很简单。于是修改如下:
DaShangPopup payPopup =new DaShangPopup(LiveDetailActivity.this);
payPopup.setSureText("确定");
payPopup.setOnClickListener(newView.OnClickListener() {
@Override
public void onClick(View v) {
if(v.getId() == R.id.sure) {
String pwd =payPopup.getPwd();
payMoney(pwd);
}
//隐藏键盘,inputEt是输入框
hideSoftKeyboard();
InputMethodManager inputmanger = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
inputmanger.hideSoftInputFromWindow(inputEt.getWindowToken(),0);
}
});
payPopup.showAtLocation(LiveDetailActivity.this.getContentView(),Gravity.CENTER,0,0);
运行后发现不起作用。为啥不起作用呢?看下hideSoftInputFromWindow的逻辑:
public boolean hide SoftInputFromWindow(IBinder windowToken, intflags) {
return hideSoftInputFromWindow(windowToken,flags, null);
}
public boolean hideSoftInputFromWindow(IBinder windowToken, intflags,
ResultReceiver resultReceiver) {
checkFocus();
synchronized(mH) {
if(mServedView==null||mServedView.getWindowToken() != windowToken) {
return false;
}
try{
returnmService.hideSoftInput(mClient,flags,resultReceiver);
}catch(RemoteException e) {
}
return false;
}
}
看到这里基本就明白为啥没反应了,弹窗都消失了,windowToken当然就自然返回null了。
找到问题解决办法就简单了,重写PopupWindow的onDismiss方法,在窗口消失之前,隐藏键盘就可以了。代码如下:
@Override
public void dismiss() {
InputMethodManager mInputMethodManager = (InputMethodManager)context.getSystemService(Context.INPUT_METHOD_SERVICE);
mInputMethodManager.hideSoftInputFromWindow(pwdEt.getWindowToken(),InputMethodManager.RESULT_UNCHANGED_SHOWN);
super.dismiss();
}
网友评论