zoukankan      html  css  js  c++  java
  • Android点击空白处,隐藏软键盘

    在做登陆或者注册的时候,软键盘经常可能会挡住一些界面。我们需要在输入完成之后隐藏软键盘。

    在我们点击空白处或者非EditText的地方来隐藏软键盘。

    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);  
            }  
        }  
      ......  
    }  
    

      

    在isShouldHideInput中不应该使用event.getX()函数,而是应该用event.getRawX()函数

    public final float getRawX ()   
    Added in API level 1  
    Returns the original raw X coordinate of this event. For touch events on the screen, this is the original location of the event on the screen, before it had been adjusted for the containing window and views.  
    

      

    这个是相对于屏幕左上角的点
    
    
    public final float getX ()   
    Added in API level 1  
    getX(int) for the first pointer index (may be an arbitrary pointer identifier).  
    这个是触摸点相对于该widget的坐标
    InputMethodManager im = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);  
            im.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(),  InputMethodManager.HIDE_NOT_ALWAYS);  
    

      

  • 相关阅读:
    采用C/C++语言如何实现复数抽象数据类型Complex
    单链表的插入伪算法和用C语言创建单链表,并遍历
    SQL多列查询最大值
    修改网页页面显示内容
    成为智者的四个敌人——唐望
    从0到1:构建强大且易用的规则引擎(转)
    身份采集、活体检测、人脸比对...旷视是如何做FaceID的? (转)
    drools -Rete算法(转)
    风控决策引擎系统的搭建设计指南(转载)
    [上市与资本运作] 【干货】创业公司天使轮、A轮、B轮……IPO融资时如何分配股权?(转载)
  • 原文地址:https://www.cnblogs.com/rencm/p/5146196.html
Copyright © 2011-2022 走看看