dialog dismiss时键盘不消失的问题浅析及解决办法
作者:猪猪上 时间:2021-09-18 10:06:30
当setCanceledOnTouchOutside(true)
,点击阴影处,dialog dismiss时键盘不消失的问题。
如图
一开始觉得很简单,监听下onDimiss()
方法,在里面隐藏键盘不就行了。
但是发现大多数手机都不会隐藏(魅族x4会隐藏)。
这是为什么呢?为什么键盘不消失呢?
经过测试,发现edittext.getWindowToken()
为null。
/**
* 关闭键盘
*
* @param context
* @param et
*/
public static void hideKeyboard(Context context, EditText et) {
InputMethodManager imm = (InputMethodManager) context
.getSystemService(Context.INPUT_METHOD_SERVICE);
LogUtils.showLog("hideKeyboard imm.isActive() = "+imm.isActive()+" et.getWindowToken() = "+et.getWindowToken());
if (imm.isActive()) {
imm.hideSoftInputFromWindow(et.getWindowToken(), 0);
}
}
这是因为当ondismiss 方法执行的时候,dialog已经消失了。已经获取不到windowToken了。
目前发现有两种方式觉得这样的问题
1.在ondismiss()方法里面这样隐藏软键盘
@Override
public void onDismiss(DialogInterface dialog) {
InputMethodManager inputMgr = (InputMethodManager) context
.getSystemService(Context.INPUT_METHOD_SERVICE);
inputMgr.toggleSoftInput(InputMethodManager.HIDE_NOT_ALWAYS, 0);
}
2.在dismiss之前就隐藏软键盘,因为设置setCancelOnTouchOutside(true),会响应Dialog类的onTouch方法。
public boolean onTouchEvent(MotionEvent event) {
if (mCancelable && mShowing && mWindow.shouldCloseOnTouch(mContext, event)) {
cancel();
return true;
}
return false;
}
/**
* Cancel the dialog. This is essentially the same as calling {@link #dismiss()}, but it will
* also call your {@link DialogInterface.OnCancelListener} (if registered).
*/
public void cancel() {
if (!mCanceled && mCancelMessage != null) {
mCanceled = true;
// Obtain a new message so this dialog can be re-used
Message.obtain(mCancelMessage).sendToTarget();
}
dismiss();
}
重写下onTouch()方法就可以了。代码如下
@Override
public boolean onTouchEvent(MotionEvent event) {
if (isShowing() && shouldCloseOnTouch(getContext(),event)){
ViewHelper.hideKeyboard(context, et_reply_comment);
}
return super.onTouchEvent(event);
}
public boolean shouldCloseOnTouch(Context context, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN
&& isOutOfBounds(context, event) && getWindow().peekDecorView() != null) {
return true;
}
return false;
}
private boolean isOutOfBounds(Context context, MotionEvent event) {
final int x = (int) event.getX();
final int y = (int) event.getY();
final int slop = ViewConfiguration.get(context).getScaledWindowTouchSlop();
final View decorView = getWindow().getDecorView();
return (x < -slop) || (y < -slop)
|| (x > (decorView.getWidth()+slop))
|| (y > (decorView.getHeight()+slop));
}
// 关闭键盘
public static void hideKeyboard(Context context, EditText et) {
InputMethodManager imm = (InputMethodManager) context
.getSystemService(Context.INPUT_METHOD_SERVICE);
LogUtils.showLog("hideKeyboard imm.isActive() = "+imm.isActive()+" et.getWindowToken() = "+et.getWindowToken());
if (imm.isActive()) {
imm.hideSoftInputFromWindow(et.getWindowToken(), 0);
}
}
经测试,以上两种方法都可以关闭软键盘。
另外附在dialog启动时弹出软键盘代码,重写onStart方法
@Override
protected void onStart() {
super.onStart();
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
}
以上所述是小编给大家介绍的dialog dismiss时键盘不消失的问题浅析网站的支持!
来源:http://blog.csdn.net/a77979744/article/details/54289909
标签:dialog,dismiss,键盘,不消失
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
JavaWeb实现学生信息管理系统(2)
2022-03-04 02:31:12
![](https://img.aspxhome.com/file/2023/3/116833_0s.jpg)
JAVA读取属性文件的几种方法总结
2023-10-21 04:36:40
springmvc+mybatis 做分页sql 语句实例代码
2021-09-11 19:29:06
Spring Feign超时设置深入了解
2022-01-17 10:39:06
![](https://img.aspxhome.com/file/2023/7/86727_0s.png)
spring boot写java web和接口
2022-10-02 09:52:02
![](https://img.aspxhome.com/file/2023/8/103978_0s.png)
Java中静态类型检查是如何进行的实例思路详解
2022-01-01 16:08:30
Entity Framework代码优先(Code First)模式
2022-07-28 05:31:05
![](https://img.aspxhome.com/file/2023/2/85702_0s.png)
ExpandableListView实现二级列表购物车
2022-07-27 05:54:13
![](https://img.aspxhome.com/file/2023/4/90154_0s.jpg)
Java利用apache ftp工具实现文件上传下载和删除功能
2022-03-17 02:04:01
浅谈Silverlight 跨线程的使用详解
2021-10-16 01:23:05
![](https://img.aspxhome.com/file/2023/7/79057_0s.gif)
C#模拟实现QQ窗体功能
2021-07-17 02:49:11
![](https://img.aspxhome.com/file/2023/6/77236_0s.png)
Unity3D撤回命令开发详解
2022-01-15 09:26:21
![](https://img.aspxhome.com/file/2023/8/116608_0s.gif)
Android获取设备CPU核数、时钟频率以及内存大小的方法
2022-09-13 07:09:32
一文带你了解如何正确使用Java中的字符串常量池
2022-07-13 01:35:30
![](https://img.aspxhome.com/file/2023/3/66933_0s.png)
解决Jenkins集成SonarQube遇到的报错问题
2023-11-24 08:54:10
![](https://img.aspxhome.com/file/2023/6/64396_0s.png)
利用Intellij Idea连接远程服务器实现远程上传部署功能
2022-05-31 13:15:54
![](https://img.aspxhome.com/file/2023/0/62440_0s.png)
关于spring boot中几种注入方法的一些个人看法
2022-09-07 10:15:14
c#连接mdf文件示例分享
2022-12-15 10:48:33
基于SpringBoot实现用户身份验证工具
2022-05-08 18:37:29
java的package和import机制原理解析
2021-07-20 08:19:05
![](https://img.aspxhome.com/file/2023/6/108436_0s.png)