dialog dismiss时键盘不消失的问题浅析及解决办法
发布时间 - 2026-01-10 22:24:31 点击率:次当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时键盘不消失的问题浅析,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
# dialog
# dismiss键盘不消失
# jquery dialog键盘事件代码
# 小编
# 这是
# 在此
# 两种
# 给大家
# 很简单
# 弹出
# 重写
# 在里面
# 什么呢
# 如图
# 有两种
# 这是因为
# 前就
# 所述
# 给我留言
# 启动时
# 感谢大家
# 就可以
# 魅族
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
JS去除重复并统计数量的实现方法
JavaScript模板引擎Template.js使用详解
Laravel如何实现多对多模型关联?(Eloquent教程)
Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑
如何破解联通资金短缺导致的基站建设难题?
网站制作软件免费下载安装,有哪些免费下载的软件网站?
手机网站制作与建设方案,手机网站如何建设?
Laravel怎么集成Log日志记录_Laravel单文件与每日日志配置及自定义通道【详解】
如何解决hover在ie6中的兼容性问题
如何在Tomcat中配置并部署网站项目?
jquery插件bootstrapValidator表单验证详解
HTML 中动态设置元素 name 属性的正确语法详解
Laravel如何与Inertia.js和Vue/React构建现代单页应用
网站优化排名时,需要考虑哪些问题呢?
Laravel如何配置中间件Middleware_Laravel自定义中间件拦截请求与权限校验【步骤】
百度输入法ai面板怎么关 百度输入法ai面板隐藏技巧
香港服务器选型指南:免备案配置与高效建站方案解析
如何在HTML表单中获取用户输入并结合JavaScript动态控制复利计算循环
Laravel如何实现图片防盗链功能_Laravel中间件验证Referer来源请求【方案】
Laravel如何升级到最新的版本_Laravel版本升级流程与兼容性处理
JavaScript如何实现错误处理_try...catch如何捕获异常?
Laravel如何使用缓存系统提升性能_Laravel缓存驱动和应用优化方案
Laravel如何实现全文搜索_Laravel Scout集成Algolia或Meilisearch教程
如何基于PHP生成高效IDC网络公司建站源码?
HTML透明颜色代码在Angular里怎么设置_Angular透明颜色使用指南【详解】
作用域操作符会触发自动加载吗_php类自动加载机制与::调用【教程】
phpredis提高消息队列的实时性方法(推荐)
大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?
Laravel如何实现API版本控制_Laravel版本化API设计方案
公司门户网站制作流程,华为官网怎么做?
网站制作报价单模板图片,小松挖机官方网站报价?
如何构建满足综合性能需求的优质建站方案?
Laravel怎么导出Excel文件_Laravel Excel插件使用教程
Laravel如何创建自定义中间件?(Middleware代码示例)
如何在阿里云部署织梦网站?
Android中AutoCompleteTextView自动提示
高性能网站服务器部署指南:稳定运行与安全配置优化方案
Laravel模型关联查询教程_Laravel Eloquent一对多关联写法
Windows Hello人脸识别突然无法使用
如何用免费手机建站系统零基础打造专业网站?
Laravel如何与Vue.js集成_Laravel + Vue前后端分离项目搭建指南
Laravel如何设置自定义的日志文件名_Laravel根据日期或用户ID生成动态日志【技巧】
高性能网站服务器配置指南:安全稳定与高效建站核心方案
如何快速搭建二级域名独立网站?
Laravel Blade组件怎么用_Laravel可复用视图组件的创建与使用
Laravel怎么判断请求类型_Laravel Request isMethod用法
深圳网站制作培训,深圳哪些招聘网站比较好?
如何快速搭建高效WAP手机网站吸引移动用户?
edge浏览器无法安装扩展 edge浏览器插件安装失败【解决方法】
详解Android图表 MPAndroidChart折线图

