zoukankan      html  css  js  c++  java
  • [转]Android 完美的隐藏软键盘方法 点击编辑框外软键盘消失

     

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

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

    public class HomeActivity extends Activity {
         ......
         @Override
         public boolean dispatchTouchEvent(MotionEvent ev) {
             if (ev.getAction() == MotionEvent.ACTION_DOWN) {
     
                 // 获得当前得到焦点的View,一般情况下就是EditText(特殊情况就是轨迹求或者实体案件会移动焦点)
                 View v = getCurrentFocus();
     
                 if (isShouldHideInput(v, ev)) {
                     hideSoftInput(v.getWindowToken());
                 }
             }
             return super.dispatchTouchEvent(ev);
         }
     
         /**
          * 根据EditText所在坐标和用户点击的坐标相对比,来判断是否隐藏键盘,因为当用户点击EditText时没必要隐藏
          * 
          * @param v
          * @param event
          * @return
          */
         private boolean isShouldHideInput(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;
                 }
             }
             // 如果焦点不是EditText则忽略,这个发生在视图刚绘制完,第一个焦点不在EditView上,和用户用轨迹球选择其他的焦点
             return false;
         }
     
         /**
          * 多种隐藏软件盘方法的其中一种
          * 
          * @param token
          */
         private void hideSoftInput(IBinder token) {
             if (token != null) {
                 InputMethodManager im = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                 im.hideSoftInputFromWindow(token,
                         InputMethodManager.HIDE_NOT_ALWAYS);
             }
         }
       ......
     }

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

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

    原文链接:http://www.cnblogs.com/coding-way/archive/2012/07/10/2585511.html
  • 相关阅读:
    【BZOJ4198】[Noi2015]荷马史诗 贪心+堆
    【BZOJ4200】[Noi2015]小园丁与老司机 DP+最小流
    【BZOJ2839】集合计数 组合数+容斥
    【BZOJ2989】数列 kd-tree
    【BZOJ4240】有趣的家庭菜园 树状数组+贪心
    【BZOJ4238】电压 DFS树
    【BZOJ4237】稻草人 cdq分治+单调栈+二分
    Python Web学习笔记之WebSocket原理说明
    Python Web学习笔记之Cookie,Session,Token区别
    Python Web学习笔记之图解TCP/IP协议和浅析算法
  • 原文地址:https://www.cnblogs.com/wei1228565493/p/4589056.html
Copyright © 2011-2022 走看看