简单了解事件的触发机制

在Android中,View的结构是树状的,所以,当触发触摸事件的时候,其事件传递也是从上之下一层层的传递。下面我们结合例子来一点点进行分析。

首先,我们需要了解事件处理中的几个方法:

1、在ViewGroup中,事件分为dispatchTouchEvent(事件的分发),onInterceptTouchEvent(事件的拦截),onTouchEvent(事件的处理)。

2、在View中,事件分为dispatchTouchEvent(事件的分发),onTouchEvent(事件的处理)。

关闭软键盘思路

1、监听整个页面的事件分发(即ViewGroup中的dispatchTouchEvent)

2、用getCurrentFocus()方法获取当前焦点所在的view,以及在其父窗口中的坐标位置

3、根据EditText所在坐标和用户点击的坐标相对比,判断是否点击的区域在EditText的区域范围内

效果图

相关代码

事件分发

    @Overridepublic boolean dispatchTouchEvent(MotionEvent ev) {if (ev.getAction() == MotionEvent.ACTION_DOWN) {View v = getCurrentFocus();if (isShouldHideKeyboard(v, ev)) {hideKeyboard(CloseSoftKeyBoard.this,Objects.requireNonNull(v).getWindowToken());}}return super.dispatchTouchEvent(ev);}

判断点击的区域是否需要关闭软键盘

    /*** 根据EditText所在坐标和用户点击的坐标相对比,来判断是否隐藏键盘,因为当用户点击EditText时则不能隐藏*/public static boolean isShouldHideKeyboard(View v, MotionEvent event) {if (v != null && (v instanceof EditText)) {int[] l = {0, 0};v.getLocationInWindow(l);//得到输入框在屏幕中上下左右的位置int left = l[0], top = l[1], bottom = top + v.getHeight(), 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;}

关闭软键盘

    /*** 获取InputMethodManager,隐藏软键盘*/public static void hideKeyboard(Activity activity, IBinder token) {if (token != null) {InputMethodManager im = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);Objects.requireNonNull(im).hideSoftInputFromWindow(token, InputMethodManager.HIDE_NOT_ALWAYS);}}

简单处理点击EditText外部区域关闭软键盘相关推荐

  1. android点击软键盘外面的区域关闭软键盘解决办法

    很多时候在一个页面有多个输入框或者输入框加选择框的时候,我们需要根据用户的点击去关闭软键盘. 在Activity中加入以下代码即可 /**重写dispatchTouchEvent* 点击软键盘外面的区 ...

  2. Android 点击EditText外部区域失去焦点的方法

    可能大家都遇到多个输入框,当某个输入框有焦点时,光标显示.当我们点击输入框以外的地方.使输入框焦点消失,隐藏键  盘. //使editText点击外部时候失去焦点@Overridepublic boo ...

  3. 点击空白区域关闭软键盘

    很多时候,需求需要点击输入框其他地方,关闭软键盘,下面分享一个utils public class HideKeyBroadUtils {private HideKeyBroadUtils(){}/* ...

  4. DialogFragment常见问题(黑色棱角、点击编辑框外关闭软键盘..)

    1.设置对话框外部的背景为完全透明: 在onStart()方法中加入以下代码: @Overridepublic void onStart() {super.onStart();/*** 将对话框外部( ...

  5. 打开关闭软键盘,点击屏幕其他地方关闭软键盘

    打开关闭软键盘,点击屏幕其他地方关闭软键 关闭然键盘: public void closeKeyboard() {View rootView = getWindow().getDecorView(); ...

  6. android edittext失去焦点,Android 点击EditText外部区域失去焦点的方法

    可能大家都遇到多个输入框,当某个输入框有焦点时,光标显示.当我们点击输入框以外的地方.使输入框焦点消失,隐藏键  盘. //使editText点击外部时候失去焦点 @Override public b ...

  7. 点击EditText外部区域失去焦点的方法

    复制到Activity即可 @Overridepublic boolean dispatchTouchEvent(MotionEvent ev) {if (ev.getAction() == Moti ...

  8. Android 当EditextText失去焦点,或者点击Activity的时候关闭软键盘或者其他布局

    当我们点击EditText的时候会默认弹出系统的软键盘,当点击其他控件的时候,默认是不会关闭其他系统键盘的,或者自己定义的类似popwindow类似效果的时候 点击其他地方的时候,自己定义的布局会自动 ...

  9. android 关闭软键盘,点击软键盘之外关闭软键盘,editText关闭键盘

    /*** @description 关闭界面软键盘方法 复制直接调closeKeyBoard()用即可实现关闭软键盘*/ private InputMethodManager mImm; public ...

  10. android 点击关闭软键盘

    在项目中,editText获取焦点后,会自动弹出软键盘,关闭的时候一般需要按返回键或者点击软键盘上的按钮, 即使当前activity已经finish掉,软键盘依然存在,会影响用户的体验. 网上目前有很 ...

最新文章

  1. Java源码详解零:HashMap介绍
  2. Red Hat Enterprise Linux 5.4安装GCC
  3. LIBSVM使用方法
  4. SpringCloud(二) 生产者、消费者工程搭建与调用(下)
  5. 实验楼python挑战答案_python基础知识
  6. linux轻量级的图形库,基于Microwindows的嵌入式Linux轻量级图形应用库的设计
  7. Python基础知识之二
  8. 验票证明怎么打印_发票真伪查询打印系统软件
  9. 【ZMap】unable to initialize blacklist / whitelist
  10. 【uni-app踩坑记录】uni-starter本地微信一键授权登录失败
  11. node 后台重定向_Node.js如何实现重定向
  12. Linux mail 命令(smtp.163.com)
  13. 异常(Exception)
  14. 28个在线游戏编程学习网站
  15. 解决: Error Code: 2013. Lost connection to MySQL server during query
  16. 线性规划求解——增广拉格朗日函数法
  17. 门控时钟电路(Intergrated clock gating)
  18. Day08-整合富文本编辑器-p115
  19. 如何用java POI在excel中画线_java poi对excel的操作详解
  20. linux忘记root密码的解决办法

热门文章

  1. QQ第三方网站授权登陆深入分析及cookie的高级运用
  2. mysql standby_数据库的 standby模式
  3. ESP系统——ABS、TCS、VDC及VAF功能介绍
  4. 【6035】聊聊各种“上门”能不能做起来
  5. Ant 下载和配置过程
  6. 沙耶的玩偶(doll)
  7. 平均获客成本_获客成本5年翻了6倍,布局私域流量的背后隐藏了哪些惊人数据?...
  8. Pr:旧版标题字幕设计器
  9. 两台设备(手动)设置相同的局域网IP地址会怎么样?
  10. java面试问题与心得