dialog dismiss时键盘不消失的问题。
当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时键盘不消失的问题。相关推荐
- Dialog dismiss 流程
Dialog.dismiss(): 如果是在非UI线程调用,会将dismiss这个指令schedule到UI线程的handler来异步执行 否则同步执行. Dialog.dismissDialog() ...
- Android Dialog与软键盘的正确打开方式
1.写在前面 2017年的第一篇博客,首先祝大家新年快乐,在新的一年里健健康康.平平安安! 本篇博客的主要内容是关于在Dialog中软键盘的显示与隐藏问题,需求是在Dialog中有一个密码输入框,弹出 ...
- android仿微博底部键盘,keyboard dialog 仿微博键盘
功能描述:弹出键盘,右边有最大化按钮,没有最大化的时候最大行数为3,默认1行,随着文字输入增加自动增加高度,到达3行时不会在增加,点击最大化输入框,行数无限制,输入框下方图片点击删除 此处为了简便,键 ...
- android dialog 点击确定不消失,AlertDialog点击按钮不消失的实现方法
我有一个文本输入对话框,当我点击对话框上的"是"按钮,它会验证输入,然后关闭对话框. 但是,如果输入错误,我想停留在同一个对话框中.. 每一次,无论输入是什么,对话框应该自动关闭, ...
- activity关闭和dialog.dismiss冲突的解决(Activity has leaked window com.android.internal.p
其意思大概就是:窗体已经关闭了但是dialog仍然在显示,Activity has leaked window(activity渗透出窗体),大概就是这个意思. 那么就要在activity finis ...
- krpano场景拖动时拖动惯性消失的问题
问题背景:在写一个基于krpano的全景项目时突然发现场景拖动时拖动惯性消失了.查看官方文档,检查和控制相关的control标签的参数没有问题,并且也一直没有修改过. 排查过程:推测为某插件调用了相关 ...
- android 日期键盘,android 日期时间格式转换;软键盘显示消失;获取系统title
获取activty title bar: TextView actionTitle = (TextView) findViewById(com.android.internal.R.id.action ...
- Android 仿今日头条评论时键盘自动弹出的效果
Android 仿今日头条评论时键盘自动弹出的效果:当点击评论时,弹出对话框,同时弹出软键盘,当点击返回键时,将对话框关闭,不只是关闭软键盘. 效果图: 对这个对话框设置一个style效果: < ...
- textFieldShouldReturn方法键盘无法消失 无法return的问题
作为一个新手今天又犯了一个低级错误,在实现协议<UITextFieldDelegate>调用 -(BOOL)textFieldShouldReturn:(UITextField *)tex ...
最新文章
- 深度学习之父Hinton:下一代神经网络
- (Java)程序员应打破牢笼,展望更高层次的世界
- xpath技术解析xml以及案例模拟用户登录效果
- (转)javabean是什么和总结javabean的两种使用方式
- zuul在zuulFilter获取返回值后,接口获取不到数据
- 用GCD线程组与GCD信号量将异步线程转换为同步线程
- matlab采样频谱,Matlab对采样数据进行频谱分析
- 第二篇:呈现内容_第四节:个性化自定义控件
- shell备份mysql思路_写一个shell脚本备份mysql数据库的步骤
- Jan 09 - Count Primes; Mathematics; Optimization; Primes; DP;
- python对XML 操作
- Entity Framework 代码先行之约定配置
- 通过cURL获取web页面及http header信息
- 什么是压力测试,如何做压力测试?
- Sketch 54.1 Shark 鲨鱼中文汉化特别版 Mac 设计师必备的原型UI设计工具
- matlab多行注释快捷键。
- 无效的m3u8怎么办_你还在为m3u8文件如何转换而发愁?看了我就有答案了
- 想成功就不要设定目标,你信吗?
- 2021-11-03 - 英文/英语简写 - 收集
- postgresql 高可用 repmgr 的使用之四 1 Primary + 1 Standby 的 switchover