当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()方法里面这样隐藏软键盘(有可能没有效果)

 @Overridepublic 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-usedMessage.obtain(mCancelMessage).sendToTarget();}dismiss();}

重写下onTouch()方法就可以了。代码如下

    @Overridepublic 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方法

    @Overrideprotected void onStart() {super.onStart();getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);}

dialog dismiss时键盘不消失的问题。相关推荐

  1. Dialog dismiss 流程

    Dialog.dismiss(): 如果是在非UI线程调用,会将dismiss这个指令schedule到UI线程的handler来异步执行 否则同步执行. Dialog.dismissDialog() ...

  2. Android Dialog与软键盘的正确打开方式

    1.写在前面 2017年的第一篇博客,首先祝大家新年快乐,在新的一年里健健康康.平平安安! 本篇博客的主要内容是关于在Dialog中软键盘的显示与隐藏问题,需求是在Dialog中有一个密码输入框,弹出 ...

  3. android仿微博底部键盘,keyboard dialog 仿微博键盘

    功能描述:弹出键盘,右边有最大化按钮,没有最大化的时候最大行数为3,默认1行,随着文字输入增加自动增加高度,到达3行时不会在增加,点击最大化输入框,行数无限制,输入框下方图片点击删除 此处为了简便,键 ...

  4. android dialog 点击确定不消失,AlertDialog点击按钮不消失的实现方法

    我有一个文本输入对话框,当我点击对话框上的"是"按钮,它会验证输入,然后关闭对话框. 但是,如果输入错误,我想停留在同一个对话框中.. 每一次,无论输入是什么,对话框应该自动关闭, ...

  5. activity关闭和dialog.dismiss冲突的解决(Activity has leaked window com.android.internal.p

    其意思大概就是:窗体已经关闭了但是dialog仍然在显示,Activity has leaked window(activity渗透出窗体),大概就是这个意思. 那么就要在activity finis ...

  6. krpano场景拖动时拖动惯性消失的问题

    问题背景:在写一个基于krpano的全景项目时突然发现场景拖动时拖动惯性消失了.查看官方文档,检查和控制相关的control标签的参数没有问题,并且也一直没有修改过. 排查过程:推测为某插件调用了相关 ...

  7. android 日期键盘,android 日期时间格式转换;软键盘显示消失;获取系统title

    获取activty title bar: TextView actionTitle = (TextView) findViewById(com.android.internal.R.id.action ...

  8. Android 仿今日头条评论时键盘自动弹出的效果

    Android 仿今日头条评论时键盘自动弹出的效果:当点击评论时,弹出对话框,同时弹出软键盘,当点击返回键时,将对话框关闭,不只是关闭软键盘. 效果图: 对这个对话框设置一个style效果: < ...

  9. textFieldShouldReturn方法键盘无法消失 无法return的问题

    作为一个新手今天又犯了一个低级错误,在实现协议<UITextFieldDelegate>调用 -(BOOL)textFieldShouldReturn:(UITextField *)tex ...

最新文章

  1. 深度学习之父Hinton:下一代神经网络
  2. (Java)程序员应打破牢笼,展望更高层次的世界
  3. xpath技术解析xml以及案例模拟用户登录效果
  4. (转)javabean是什么和总结javabean的两种使用方式
  5. zuul在zuulFilter获取返回值后,接口获取不到数据
  6. 用GCD线程组与GCD信号量将异步线程转换为同步线程
  7. matlab采样频谱,Matlab对采样数据进行频谱分析
  8. 第二篇:呈现内容_第四节:个性化自定义控件
  9. shell备份mysql思路_写一个shell脚本备份mysql数据库的步骤
  10. Jan 09 - Count Primes; Mathematics; Optimization; Primes; DP;
  11. python对XML 操作
  12. Entity Framework 代码先行之约定配置
  13. 通过cURL获取web页面及http header信息
  14. 什么是压力测试,如何做压力测试?
  15. Sketch 54.1 Shark 鲨鱼中文汉化特别版 Mac 设计师必备的原型UI设计工具
  16. matlab多行注释快捷键。
  17. 无效的m3u8怎么办_你还在为m3u8文件如何转换而发愁?看了我就有答案了
  18. 想成功就不要设定目标,你信吗?
  19. 2021-11-03 - 英文/英语简写 - 收集
  20. postgresql 高可用 repmgr 的使用之四 1 Primary + 1 Standby 的 switchover

热门文章

  1. js获取对象的父元素,子元素,兄弟元素
  2. 电子战基本概念 (01)
  3. python循环语句和跳出语句详解
  4. RIP路由防止环路的方法
  5. 阿里笔试2023-3-15
  6. AHCI导致启动win7蓝屏的解决
  7. 2字节、4字节、8字节的有符号整数的取值范围
  8. 软件测试|缺陷的生命周期是怎么样的
  9. matlab之“audioread”函数帮助文档翻译
  10. 李嘉诚,原一平的故事