完美解决点击空白处,隐藏软键盘

在做一对一聊天的时候,应该做成类似微信的那种处理方式,点击空白处以及非EditText处的时候可以隐藏软键盘。

网上搜的时候搜到一个靠谱的做法,链接如下:http://www.cnblogs.com/coding-way/archive/2012/07/10/2585511.html

代码如下:

复制代码
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的坐标

如果还是不太清楚,可以看如下链接:

http://www.360doc.com/content/13/0815/20/7179579_307418542.shtml这个讲的比较详细

 

本文转载于:http://blog.csdn.net/sanjinxiong/article/details/9989517

实际使用:

复制代码
    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        if (ev.getAction() == MotionEvent.ACTION_DOWN) {

            // 获得当前得到焦点的View,一般情况下就是EditText(特殊情况就是轨迹求或者实体案件会移动焦点)
            // View v = getCurrentFocus();

            if (isShouldHideInput(ev)) {
                dismissKeyBoard();
            }
        }
        return super.dispatchTouchEvent(ev);
    }

    /**
     * 根据EditText所在坐标和用户点击的坐标相对比,来判断是否隐藏键盘,因为当用户点击EditText时没必要隐藏
     * 
     * @param v
     * @param event
     * @return
     */
    private boolean isShouldHideInput(MotionEvent event) {

        if (et_txt != null) {
            int[] E = {0, 0};
            et_txt.getLocationInWindow(E);
            int leftEdit = E[0], topEdit = E[1], bottomEdit = topEdit + et_txt.getHeight(), rightEdit = leftEdit
                    + et_txt.getWidth();

            if (event.getX() > leftEdit && event.getX() < rightEdit && event.getY() > topEdit
                    && event.getY() < bottomEdit) {
                // 点击EditText的事件,忽略它。
                return false;
            } else {
                return true;
            }
        } 
            // 如果焦点不是EditText则忽略,这个发生在视图刚绘制完,第一个焦点不在EditView上,和用户用轨迹球选择其他的焦点
            return false;

    }
复制代码
et_txt:为当前页面的文本输入框

 
posted @   似水流云  阅读(1667)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
历史上的今天:
2014-01-10 eclipse 修改设置Ctrl+Shift+F长度
2014-01-10 android之handler obtainmessge与New message区别
点击右上角即可分享
微信分享提示