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折线图