博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
点击屏幕上EditText区域以外的任何地方隐藏键盘的解决方法
阅读量:6324 次
发布时间:2019-06-22

本文共 2811 字,大约阅读时间需要 9 分钟。

解决思路与iOS中的事件分发机制是类似的,这是Activity.class中的事件分发函数:

(1)下面的函数可以处理所有的点击事件,但是要注意到不能无故拦截。

 

/**     * Called to process touch screen events.  You can override this to     * intercept all touch screen events before they are dispatched to the     * window.  Be sure to call this implementation for touch screen events     * that should be handled normally.     *      * @param ev The touch screen event.     *      * @return boolean Return true if this event was consumed.     */    public boolean dispatchTouchEvent(MotionEvent ev) {        if (ev.getAction() == MotionEvent.ACTION_DOWN) {            onUserInteraction();        }        if (getWindow().superDispatchTouchEvent(ev)) {            return true;        }        return onTouchEvent(ev);    }

(2)用户布局文件中定义的元素都可以接受TouchEvent,下面的函数只是处理窗口之外空白区域的点击。

 

 

/**     * Called when a touch screen event was not handled by any of the views     * under it.  This is most useful to process touch events that happen     * outside of your window bounds, where there is no view to receive it.     *      * @param event The touch screen event being processed.     *      * @return Return true if you have consumed the event, false if you haven't.     * The default implementation always returns false.     */    public boolean onTouchEvent(MotionEvent event) {        if (mWindow.shouldCloseOnTouch(this, event)) {            finish();            return true;        }                return false;    }

因此,需要拦截点击事件进行重新分发,在Activity的任意子类(含SDK或者用户自定义的)中都可以重写:

 

 

//点击EditText以外的任何区域隐藏键盘    @Override    public boolean dispatchTouchEvent(MotionEvent ev) {        if (ev.getAction() == MotionEvent.ACTION_DOWN) {              View v = getCurrentFocus();            if (Utils.isShouldHideInput(v, ev)) {                if(Utils.hideInputMethod(this, v)) {                    return true; //隐藏键盘时,其他控件不响应点击事件==》注释则不拦截点击事件                }            }        }        return super.dispatchTouchEvent(ev);       }
public static boolean isShouldHideInput(View v, MotionEvent event) {        if (v != null && (v instanceof EditText)) {            int[] leftTop = { 0, 0 };            v.getLocationInWindow(l);            int left = leftTop[0], top = leftTop[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;    }
public static Boolean hideInputMethod(Context context, View v) {	InputMethodManager imm = (InputMethodManager) context		.getSystemService(Context.INPUT_METHOD_SERVICE);	if (imm != null) {		return imm.hideSoftInputFromWindow(v.getWindowToken(), 0);	}	return false;    }

 

 

转载地址:http://yvpaa.baihongyu.com/

你可能感兴趣的文章
vue的表单的简单介绍 input radio checkbox等表单特性
查看>>
vue中自定义指令vue.direvtive,自定义过滤器vue.filter(),vue过渡transition
查看>>
django具体操作(七)
查看>>
俄总统参观卡巴斯基实验室 强调本土产品策略
查看>>
在ASP.NET MVC3中使用“.NET研究”EFCodeFirst 1.0
查看>>
互联网进病毒高发期 黑客瞄准网络春晚
查看>>
VMware workstation 下Hadoop伪分布式模式安装
查看>>
关于Android activity生命周期
查看>>
OpenModelica仿真
查看>>
robots.txt
查看>>
Redis客户端之Spring整合Jedis
查看>>
node服务搭建流程
查看>>
ASP.NET C# 访问Access、Xml等数据库
查看>>
python-logging模块详解
查看>>
Git -- 新增分支添加新功能
查看>>
SharePoint 2013 页面访问,Url中间多一段"_layouts/15/start.aspx#"
查看>>
jstree 树形菜单问题
查看>>
JavaScript词法分析(尽力理解)
查看>>
python之编码decode
查看>>
Center Message
查看>>