在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中以最少代码实现点击其他任意位置收起软键盘的功能了。如果代码有什么需要指正或者有更好的替代方案的,请大家及时告知哈。

Android点击其他任意位置收起软键盘的更多相关文章

  1. uni-app 在input获取焦点(弹出软键盘后收起软键盘),页面不下滑,留下下方空白

    加入收起软键盘时让页面回正 uni.pageScrollTo({ scrollTop: 0, duration: 0 });

  2. android收起软键盘

    InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);if(imm != null) ...

  3. JS 实现点击页面任意位置隐藏div、span

    通过调用下面的 showhidden(“标签ID”) 显示div/span/…等标签内容,可以实现点击页面任意地方再次隐藏该标签内容,而showhidden(“标签ID”,”nohidden”)可保存 ...

  4. android只设置部分控件随着软键盘的出现而腾出空间

    转载请标明出处:https://www.cnblogs.com/tangZH/p/12013685.html 在项目过程中,出现了一个需求,软键盘要顶起部分控件,而另一部分控件不动. 关于这种需求,我 ...

  5. Android 初次进入默认不弹出软键盘

    [遇到问题] 初次进入某个界面时,当页面中有EditText ,会自动聚焦并弹出软键盘. [解决方法] getWindow().setSoftInputMode(WindowManager.Layou ...

  6. android:windowSoftInputMode属性;界面关闭后软键盘不隐藏的解决方法;

    stateUnspecified:软键盘的状态并没有指定,系统将选择一个合适的状态或依赖于主题的设置 stateUnchanged:当这个activity出现时,软键盘将一直保持在上一个activit ...

  7. android EditText自动弹出和自动关闭软键盘

    程序进入某个activity直接弹出软键盘,不能直接在OnCreate中设置,必须等View绘制事件完毕才可以弹出,需要用到Timer辅助实现,如果要实现输入的功能,必须让EditText获得焦点. ...

  8. iOS 点击TextField不弹出软键盘的解决方案

    开发中遇到: 在模拟器里面,textfield可以通过电脑键盘输入,可是怎么也不会自动弹出模拟器软键盘 解决方案: 切换一下键盘,command+shift+k,Xcode6.3 中只能是一种输入源

  9. Android获取Context(任意位置任意地方,全局上下文)

    一般获取context的方法 1.Activity.this的context (一般用法)返回当前activity的上下文,属于activity ,activity 摧毁他就摧毁 2.getAppli ...

随机推荐

  1. 【转】Android开发实践:自定义带消息循环(Looper)的工作线程

    http://ticktick.blog.51cto.com/823160/1565272 上一篇文章提到了Android系统的UI线程是一种带消息循环(Looper)机制的线程,同时Android也 ...

  2. Eclipse和Android Studio中的DDMS使用时什么不同?

    http://www.jb51.net/softjc/454131.html Eclipse和Android Studio中的DDMS使用时什么不同? 相信很多经常开发Android应用的朋友应该都接 ...

  3. ARM体系架构下的同步操作

    http://blog.hamobai.com/2012/06/28/synchronization-on-ARM-one/ 处理器在访问共享资源时,必须对临界区进行同步,即保证同一时间内,只有一个对 ...

  4. 一分钟制作U盘版BT3 - 有图滴儿 bt3破解教程

    一分钟制作 BT3 U盘版方便,快捷简单无效不退款 光盘版BT3, 大概694MB,直接刻盘,然后用光盘引导,就可以进入bt3,连接为:http://ftp.heanet.ie/mirrors/bac ...

  5. JavaScript代码优化(下载时间和执行速度优化)

    JavaScript代码的速度被分成两部分:下载时间和执行速度. 下载时间 Web浏览器下载的是js源码,因此所有长变量名和注释都回包含在内.这个因素会增加下载时间.1160是一个TCP-IP包中的字 ...

  6. 10 款精美的 CSS3 全新特效

    大家都知道,在网页制作时使用CSS技术,可以有效地对页面的布局.字体.颜色.背景和其它效果实现更加精确的控制.只要对相应的代码做一些简单的修改,就可以改变同一页面的不同部分,或者页数不同的网页的外观和 ...

  7. Nazo解密游戏攻略

    啊,终于腾出时间来玩这个游戏了,顺手写一下攻略吧…… 第0关:http://cafebabe.cc/nazo/ 第一关:第一关很简单 点一下就好了 http://cafebabe.cc/nazo/le ...

  8. thinkphp关联查询

    $list=$model->table("$dName d ,$mName m,$cName c") ->field('d.*,m.title as musicTitl ...

  9. 近期最久未使用页面淘汰算法———LRU算法(java实现)

    请珍惜小编劳动成果,该文章为小编原创,转载请注明出处. LRU算法,即Last Recently Used ---选择最后一次訪问时间距离当前时间最长的一页并淘汰之--即淘汰最长时间没有使用的页 依照 ...

  10. 虚拟机VMware 9安装苹果MAC OSX 10.8图文教程

    前些天虚拟机VMware Workstation 9出来,相信大家都已经熟悉VM9了,至于MAC OSX 10.8系统,那也是出来一段时间了,本篇文章就是来讲解VMware Workstation 9 ...