在Android应用开发中,经常出现这样的需求,用户在输入文字的过程中,可能不想继续输入了,通过滑动或者点击其他位置(除软键盘和EditText以外的任何位置),希望能够自动收回键盘,这个功能可能有些rom会自己实现了,但是大部分还是没有自己实现这个功能的,那么如果我们要自己实现,要如何解决呢?

  首先,我们当然要先拦截其他任何的用户触摸屏幕的事件,通过重写Activity的boolean dispatchTouchEvent(MotionEvent ev);可是实现拦截用户的触摸事件。代码如下:

     @Override
public boolean dispatchTouchEvent(MotionEvent ev) {
DisplayUtils.hideInputWhenTouchOtherView(this, ev, getExcludeTouchHideInputViews());
return super.dispatchTouchEvent(ev);
}

DisplayUtils.hideInputWhenTouchOtherView方法就是我们自己实现的当必要时候隐藏软键盘的代码了。关于hideInputWhenTouchOtherView的方法实现如下:

    /**
* 当点击其他View时隐藏软键盘
* @param activity
* @param ev
* @param excludeViews 点击这些View不会触发隐藏软键盘动作
*/
public static final void hideInputWhenTouchOtherView(Activity activity, MotionEvent ev, List<View> excludeViews){ if (ev.getAction() == MotionEvent.ACTION_DOWN){
if (excludeViews != null && !excludeViews.isEmpty()){
for (int i = 0; i < excludeViews.size(); i++){
if (isTouchView(excludeViews.get(i), ev)){
return;
}
}
}
View v = activity.getCurrentFocus();
if (DisplayUtils.isShouldHideInput(v, ev)){
InputMethodManager inputMethodManager = (InputMethodManager)
activity.getSystemService(Context.INPUT_METHOD_SERVICE);
if (inputMethodManager != null){
inputMethodManager.hideSoftInputFromWindow(v.getWindowToken(), 0);
}
} }
}

方法参数中的excludeViews表示点击这么View不会去试图隐藏软键盘,因为有些View的触摸事件我们有时候并不希望去隐藏软键盘,比如EditText的背景布局,聊天输入框的发送按钮等(如果摸一下发送按钮,键盘就收回去了岂不是很蛋疼)

  可以看到,整个方法方法的实现过程就是通过判断触摸位置是属于哪个View,如果是需要排除的View,就直接不处理了.如果判断出来是点击了其他任意非EditText的View,就会隐藏软键盘。其他两个判断函数如下:

     public static final boolean isTouchView(View view, MotionEvent event){
if (view == null || event == null){
return false;
}
int[] leftTop = {0, 0};
view.getLocationInWindow(leftTop);
int left = leftTop[0];
int top = leftTop[1];
int bottom = top + view.getHeight();
int right = left + view.getWidth();
if (event.getRawX() > left && event.getRawX() < right
&& event.getRawY() > top && event.getRawY() < bottom){
return true;
}
return false;
} public static final boolean isShouldHideInput(View v, MotionEvent event){
if (v != null && (v instanceof EditText)){
return !isTouchView(v, event);
}
return false;
}

  通过复用hideInputWhenTouchOtherView() 方法(甚至你可以在基类Activity里实现)就可以在任何Activity中以最少代码实现点击其他任意位置收起软键盘的功能了。如果代码有什么需要指正或者有更好的替代方案的,请大家及时告知哈。

最新文章

  1. iOS当中一些常见的面试题
  2. angular+requirejs前端整合
  3. logback使用总结
  4. 找不到命名空间命名空间:System.Windows.Forms
  5. MSSQLSERVER数据库- 作业调度定时备份数据库
  6. MYSQL学习笔记3--mysql 2PC二阶段协义 与 日志闪回
  7. 64位CentOS5.6安装Mysql 5.5.11GA
  8. Scope and Namespace
  9. session前后台交互
  10. pwn学习之二
  11. [Swift]LeetCode944. 删除列以使之有序 | Delete Columns to Make Sorted
  12. MySQL中间件之ProxySQL(12):禁止多路路由
  13. NFS客户端挂载
  14. WebMisSharp更新了,最新版本1.5.2,WebMisCentral-Client最新版
  15. Ms17-010进行WEB提权之实践下某培训靶机服务器
  16. FileReader &amp; Blob &amp; File
  17. .NetCore下使用Prometheus实现系统监控和警报 (三)集成Grafana
  18. 【教程】ubuntu下安装NFS服务器
  19. sencha touch 入门系列 (六)sencha touch运行及代码解析(下)
  20. 关于HttpWebRequest发生服务器协议冲突的解决办法

热门文章

  1. java连接mysql批量写入数据
  2. C++学习笔记之迭代器
  3. bzoj 2435: [Noi2011]道路修建 树上 dp
  4. loading-show-hide
  5. SAO总结
  6. libgo协程库:网络性能完爆ASIO异步模型(-O3测试)
  7. YYCache 设计思路
  8. Python操作MySQL之SQLAlchemy
  9. 关于InputStream 和String对象之间的相互转换
  10. ava SE ---逻辑运算符