复杂布局中点击编辑框EditText以外界面无法隐藏软键盘的解决方法
2015-09-10 16:58
429 查看
前面我写了一篇文章,题目为”如何将编辑框EditText置于系统软键盘之上及相关细节的实现“,并且在代码中介绍了使用复写onTouchEvent(MotionEvent event)方法来实现点击编辑框EditText以外界面无法隐藏软键盘的解决方法,但事实上,该方法并不总是有效,特别是在复杂的布局中往往会失效,因此特给大家分享一个比较给力的方法,那就是添加如下代码:
这里有一点细节值得注意,如果你的输入框所在布局里面除了EditText外,还有其它东西。比如你的发送按钮跟编辑框同在一个布局并且在编辑框的右边,大家都知道,我们都希望在编辑框什么都不输入时点击发送按钮提示消息为空,要求用户再次输入,而不是点完按钮就直接隐藏软键盘,这显然不符合。因此上面的isShouldHideInput方法要稍微作下调整,如下:
<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; }
相关文章推荐
- POJ - 2421 Constructing Roads(最小生成树简单题)
- 程序猿感情生活的那些事
- POJ 2752 Seek the Name, Seek the Fame
- 从K近邻算法、距离度量谈到KD树、SIFT+BBF算法
- COCI2014 COCI
- LeetCode3——Longest Substring Without Repeating Characters
- overlapped 结构
- C++Primer第五版 第1章 开始(练习解答)
- Objective-C 【从文件中读写字符串(直接读写/通过NSURL读写)】
- 设计模式 单例模式
- ZOJ 2314 Reactor Cooling 无源汇上下界网络流 可行流
- POJ 2406 Power Strings
- 软件测试1-7张内容回顾
- linux读写大文件
- printStream 和printWriter区别
- 二维及多维数组,字符串(Day-4)
- objective C中的浅复制和深复制
- POJ - 1789 Truck History(最小生成树简单题)
- UVa 1602:Lattice Animals(BFS)
- MFC 通信方面遇到的问题