Android EditText点击其他区域收起软键盘
2016-03-21 17:18
543 查看
在Activity中重写dispatchTouchEvent方法
/**
* 获取当前点击位置是否为et
*
* @param view
* 焦点所在View
* @param event
* 触摸事件
* @return
*/
public boolean isClickEt(View view, MotionEvent event) {
if (view != null && (view instanceof EditText)) {
int[] leftTop = { 0, 0 };
// 获取输入框当前的location位置
view.getLocationInWindow(leftTop);
int left = leftTop[0];
int top = leftTop[1];
// 此处根据输入框左上位置和宽高获得右下位置
int bottom = top + view.getHeight();
int right = left + view.getWidth();
if (event.getX() > left && event.getX() < right && event.getY() > top && event.getY() < bottom) {
// 点击的是输入框区域,保留点击EditText的事件
return false;
} else {
return true;
}
}
return false;
}
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
// 获取当前获得当前焦点所在View
View view = getCurrentFocus();
if (isClickEt(view, event)) {
// 如果不是edittext,则隐藏键盘
InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
if (inputMethodManager != null) {
// 隐藏键盘
inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
}
return super.dispatchTouchEvent(event);
}
/**
* 看源码可知superDispatchTouchEvent 是个抽象方法,用于自定义的Window
* 此处目的是为了继续将事件由dispatchTouchEvent(MotionEvent
* event)传递到onTouchEvent(MotionEvent event) 必不可少,否则所有组件都不能触发
* onTouchEvent(MotionEvent event)
*/
if (getWindow().superDispatchTouchEvent(event)) {
return true;
}
return onTouchEvent(event);
}
/**
* 获取当前点击位置是否为et
*
* @param view
* 焦点所在View
* @param event
* 触摸事件
* @return
*/
public boolean isClickEt(View view, MotionEvent event) {
if (view != null && (view instanceof EditText)) {
int[] leftTop = { 0, 0 };
// 获取输入框当前的location位置
view.getLocationInWindow(leftTop);
int left = leftTop[0];
int top = leftTop[1];
// 此处根据输入框左上位置和宽高获得右下位置
int bottom = top + view.getHeight();
int right = left + view.getWidth();
if (event.getX() > left && event.getX() < right && event.getY() > top && event.getY() < bottom) {
// 点击的是输入框区域,保留点击EditText的事件
return false;
} else {
return true;
}
}
return false;
}
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
// 获取当前获得当前焦点所在View
View view = getCurrentFocus();
if (isClickEt(view, event)) {
// 如果不是edittext,则隐藏键盘
InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
if (inputMethodManager != null) {
// 隐藏键盘
inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
}
return super.dispatchTouchEvent(event);
}
/**
* 看源码可知superDispatchTouchEvent 是个抽象方法,用于自定义的Window
* 此处目的是为了继续将事件由dispatchTouchEvent(MotionEvent
* event)传递到onTouchEvent(MotionEvent event) 必不可少,否则所有组件都不能触发
* onTouchEvent(MotionEvent event)
*/
if (getWindow().superDispatchTouchEvent(event)) {
return true;
}
return onTouchEvent(event);
}
相关文章推荐
- 【转】Android ImageView圆形头像
- 安卓入门学习(一)用户界面设计
- Android文件上传工具类
- Viewpager和轮播图的冲突
- Android Volley完全解析
- 自定义android图表SimpleChart
- android异步任务载入数据界面实现
- android 第三方工具使用常见异常(友盟)
- Android ExpandableListView实例Demo
- Android实现ListView嵌套Checkbox真正的多选、全选、反选
- android 代码TextVeiw 尾部添加图片
- Android-oauth2.0
- android假设重写onDraw实现一个相似TextView能够显示表情和链接的控件(一)
- Android FileObserver对文件或文件夹监听
- Android开发优化之——从代码角度进行优化
- Android checkbox怎样动态设置选中状态
- Android四大组件之Activity
- libx264 for android编译(重点是看那个configure如何配置)
- 浅谈Android的资源编译过程
- Android内存优化