复杂布局中点击编辑框EditText以外界面无法隐藏软键盘的解决方法
来源:互联网 发布:电脑测温软件 编辑:程序博客网 时间:2024/04/30 15:58
前面我写了一篇文章,题目为”如何将编辑框EditText置于系统软键盘之上及相关细节的实现“,并且在代码中介绍了使用复写onTouchEvent(MotionEvent event)方法来实现点击编辑框EditText以外界面无法隐藏软键盘的解决方法,但事实上,该方法并不总是有效,特别是在复杂的布局中往往会失效,因此特给大家分享一个比较给力的方法,那就是添加如下代码:
<pre name="code" class="java"> @Override public boolean dispatchTouchEvent(MotionEvent ev) { if (ev.getAction() == MotionEvent.ACTION_DOWN) { View v = getCurrentFocus(); if (isShouldHideInput(v, ev)) { InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); if (imm != null) { imm.hideSoftInputFromWindow(v.getWindowToken(), 0); } } return super.dispatchTouchEvent(ev); } // 必不可少,否则所有的组件都不会有TouchEvent了 if (getWindow().superDispatchTouchEvent(ev)) { return true; } return onTouchEvent(ev); } public boolean isShouldHideInput(View v, MotionEvent event) { if (v != null && (v instanceof EditText)) { int[] leftTop = { 0, 0 }; //获取输入框当前的location位置 v.getLocationInWindow(leftTop); int left = leftTop[0]; int top = leftTop[1]; int bottom = top + v.getHeight(); int right = left + v.getWidth(); if (event.getX() > left && event.getX() < right && event.getY() > top && event.getY() < bottom) { // 点击的是输入框区域,保留点击EditText的事件 return false; } else { return true; } } return false; }
这里有一点细节值得注意,如果你的输入框所在布局里面除了EditText外,还有其它东西。比如你的发送按钮跟编辑框同在一个布局并且在编辑框的右边,大家都知道,我们都希望在编辑框什么都不输入时点击发送按钮提示消息为空,要求用户再次输入,而不是点完按钮就直接隐藏软键盘,这显然不符合。因此上面的isShouldHideInput方法要稍微作下调整,如下:
public boolean isShouldHideInput(View v, MotionEvent event) { if (v != null && (v instanceof EditText)) { int[] leftTop = { 0, 0 }; //获取输入框当前的location位置 v.getLocationInWindow(leftTop); int left = leftTop[0]; int top = leftTop[1]; int bottom = top + v.getHeight(); int right = left + v.getWidth(); //event.getX() > left && event.getX() < right if (event.getY() > top && event.getY() < bottom) { // 点击的是输入框区域,保留点击EditText的事件 return false; } else { return true; } } return false; }
大家看看修改后的代码,其实我就只是隐藏掉了event.getX() > left && event.getX() < right这句代码而已,意思是我们不再判断输入框的宽度(X轴)了,而仅仅是通过判断它的高度区域(Y轴)来控制点击区域外达到隐藏软键盘的效果,这样就不会出现同一布局高度内输入框右边发送按钮点击后软键盘隐藏的情况,这是一个小技巧。至于点击发送按钮隐藏软件盘,那是你发送非空消息后要才要做的事了,直接使用软键盘管理器来操作就行了,具体操作如下代码:
if(imm != null && imm.isActive()){imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);//发送成功则隐藏软键盘}
1 0
- 复杂布局中点击编辑框EditText以外界面无法隐藏软键盘的解决方法
- 点击EditText以外的地方软键盘隐藏
- 点击空白处隐藏软键盘(点击EditText以外的地方隐藏软键盘)
- 点击EditText以外的地方隐藏输入框和软键盘
- Android点击EditText以外位置隐藏软键盘
- 点击edittext以外的地方关闭软键盘的方法
- Android Activity中点击EditText以外的位置软键盘收起
- 实现点击当前输入框以外的地方,自动隐藏输入法软键盘
- 点击屏幕上EditText区域以外的任何地方隐藏键盘的解决方法
- Android 完美的隐藏软键盘方法 点击编辑框外软键盘消失
- Android工作笔记_点击EditText以外的地方关闭软键盘的方法
- Android 通过点击EditText之外的地方隐藏软键盘
- EditText之外的地方点击怎么隐藏软键盘
- 点击EditText外的组件隐藏软键盘
- Android 通过点击EditText之外的地方隐藏软键盘
- 点击EditText外部隐藏软键盘的小技巧
- 在Android中如何通过点击edittext之外的部分使软键盘隐藏
- 在Android中如何通过点击edittext之外的部分使软键盘隐藏
- LeetCode 3 最大不重复子串
- MVC,MVP,MVVM框架剖析
- 异常处理
- 整合docker 和 jenkins
- Java表达式的数据类型自动提升问题
- 复杂布局中点击编辑框EditText以外界面无法隐藏软键盘的解决方法
- crontab 定时运行python程序遇到的一个错误
- matlab读取/播放视频的函数
- Java 设计模式——单例模式
- 值得推荐的C/C++框架和库
- jquery的showLoading遇到的奇葩问题--正在查询
- HDOJ 2594 Simpsons’ Hidden Talents
- 欢迎使用CSDN-markdown编辑器
- Use vagrant Ubuntu docker environment