最近有这么一个需求:在点击EditText时弹出软键盘,然后在点击空白处或者其他控件的时候隐藏软键盘。这个需求在平板电脑上非常实用,因为屏幕大,用户不可能每次都点左下角去隐藏,并且点击空白处更容易。

刚开始从网上搜索,不是很理想,后来突然想到Android的事件分发机制,于是想到了实现方法:

复制代码
 1 public class HomeActivity extends Activity {
 2     ......
 3     @Override
 4     public boolean dispatchTouchEvent(MotionEvent ev) {
 5         if (ev.getAction() == MotionEvent.ACTION_DOWN) {
 6 
 7             // 获得当前得到焦点的View,一般情况下就是EditText(特殊情况就是轨迹求或者实体案件会移动焦点)
 8             View v = getCurrentFocus();
 9 
10             if (isShouldHideInput(v, ev)) {
11                 hideSoftInput(v.getWindowToken());
12             }
13         }
14         return super.dispatchTouchEvent(ev);
15     }
16 
17     /**
18      * 根据EditText所在坐标和用户点击的坐标相对比,来判断是否隐藏键盘,因为当用户点击EditText时没必要隐藏
19      * 
20      * @param v
21      * @param event
22      * @return
23      */
24     private boolean isShouldHideInput(View v, MotionEvent event) {
25         if (v != null && (v instanceof EditText)) {
26             int[] l = { 0, 0 };
27             v.getLocationInWindow(l);
28             int left = l[0], top = l[1], bottom = top + v.getHeight(), right = left
29                     + v.getWidth();
30             if (event.getX() > left && event.getX() < right
31                     && event.getY() > top && event.getY() < bottom) {
32                 // 点击EditText的事件,忽略它。
33                 return false;
34             } else {
35                 return true;
36             }
37         }
38         // 如果焦点不是EditText则忽略,这个发生在视图刚绘制完,第一个焦点不在EditView上,和用户用轨迹球选择其他的焦点
39         return false;
40     }
41 
42     /**
43      * 多种隐藏软件盘方法的其中一种
44      * 
45      * @param token
46      */
47     private void hideSoftInput(IBinder token) {
48         if (token != null) {
49             InputMethodManager im = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
50             im.hideSoftInputFromWindow(token,
51                     InputMethodManager.HIDE_NOT_ALWAYS);
52         }
53     }
54   ......
55 }
复制代码

下面解释一下代码,首先这个方法要实现Activity的dispatchTouchEvent方法,其实不一定是Acitivty,3.0的Fragment也可以,主要目的是拦截用户触摸事件。具体Android的事件分发机制请看我的另一个博客:http://www.cnblogs.com/coding-way/archive/2012/07/04/2575769.html

现在,当用户触摸时,dispatchTouchEvent就会被调用,之后的方法都有比较详细的注释,不再赘述。

posted @ 2016-06-17 16:39 菁菁工作室 阅读(634) 评论(0) 推荐(0) 编辑
摘要: 当一个ListView的item中含有抢占焦点的控件的时候,我们通常在item的布局中加上这样一句: android:descendantFocusability=”blocksDescendants” 防止抢占焦点,大多数情况下都能够解决问题,但是如果是EditText的时候,就很坑了,你会发现软 阅读全文
posted @ 2016-06-17 14:58 菁菁工作室 阅读(1588) 评论(0) 推荐(0) 编辑
摘要: 一、描述: 近期一个项目中需要开发一种类似表格的界面来显示和配置参数,Android并无直接类似表格的控件支持,我采用了ListView中布局EditText和TextView来实现,其中TextView用来显示参数表示符,EditText用来显示参数值,用一个自定义AlertDialog弹出显示, 阅读全文
posted @ 2016-06-17 13:26 菁菁工作室 阅读(1392) 评论(0) 推荐(0) 编辑
摘要: 搜索单词 Windows: Ctrl + F Mac : Cmd + F 会在当前激活的文件上查询输入的关键字,以高亮显示 跳转行 Windows: Ctrl + L Mac : Cmd + L 比Eclipse更加细致,可以先输入行号,然后输入冒号,最后跟上字符的位置 Navigate菜单中有更加 阅读全文
posted @ 2016-03-10 15:25 菁菁工作室 阅读(5385) 评论(0) 推荐(0) 编辑
摘要: 在你完成应用程序的beta版本后,最后会有些人去帮你测试,使你去完善应用程序……或者会有投资青睐。但是如果测试人员有一种简单地方式去检查构建版本的应用程序会不会有帮助呢?这个教程将会向你展示这些,向你介绍一些或许很少有人知道的Xcode里面的功能。你会相信在这个教程中你不会写一行Swift的代码吗?... 阅读全文
posted @ 2015-09-10 09:42 菁菁工作室 阅读(511) 评论(0) 推荐(0) 编辑
摘要: 1、config目录下的config_global.php 文件,修改:$_config['cookie']['cookiedomain'] = '.xxxxx.com';2、config目录下的config_ucenter.php 文件,修改:define('UC_API', 'http://uc... 阅读全文
posted @ 2015-08-15 12:20 菁菁工作室 阅读(772) 评论(0) 推荐(0) 编辑
摘要: 1.基础查询 1)列出所有的WagerInformations http://localhost:9527/ODataService.svc/WagerInformations 2)按照主键查询 http://localhost:9527/ODataService.svc/Wager... 阅读全文
posted @ 2015-08-12 17:01 菁菁工作室 阅读(2237) 评论(0) 推荐(0) 编辑
摘要: 一,概述KVO,即:Key-Value Observing,它提供一种机制,当指定的对象的属性被修改后,则对象就会接受到通知。简单的说就是每次指定的被观察的对象的属性被修改后,KVO就会自动通知相应的观察者了。二,使用方法系统框架已经支持KVO,所以程序员在使用的时候非常简单。1. 注册,指定被观察... 阅读全文
posted @ 2015-08-10 12:45 菁菁工作室 阅读(209) 评论(0) 推荐(0) 编辑
摘要: KVC 与 KVO 是 Objective C 的关键概念,个人认为必须理解的东西,下面是实例讲解。Key-Value Coding (KVC)KVC,即是指NSKeyValueCoding,一个非正式的 Protocol,提供一种机制来间接访问对象的属性。KVO 就是基于 KVC 实现的关键技术之... 阅读全文
posted @ 2015-08-10 12:41 菁菁工作室 阅读(227) 评论(0) 推荐(0) 编辑
摘要: 升级Discuz! X3版本QQ互联英文乱码!connect_viewthread_share_to_qq!目前Discuz!论坛上 最简单的解决方法:第一步:后台----->站长-----> 数据库----->升级运行下面二行命令delete from `pre_common_plugin` wh... 阅读全文
posted @ 2015-07-11 23:41 菁菁工作室 阅读(516) 评论(0) 推荐(0) 编辑
点击右上角即可分享
微信分享提示