二话不说,来,直接上效果
第一步监听Activity的dispatchTouchEvent和onTouchEvent事件,在有的手机里面onTouchEvent不会触发,保险起见,这两个方法都加上,另外特别注意的是,这个两个事件的监听可以写在BaseActivity中!
代码如下:
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
hideSolftKeyboard(event);
return super.dispatchTouchEvent(event);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
hideSolftKeyboard(event);
return super.onTouchEvent(event);
}
/**
* 隐藏键盘
*/
public void hideSolftKeyboard(MotionEvent event){
try{
if(event.getAction() == MotionEvent.ACTION_DOWN){
View focusView = getCurrentFocus();
//除了点击EidtText自身区域的其他任何区域,都将键盘收起
if(null != focusView && null != focusView.getWindowToken() && !ViewUtils.isTouchView(event, focusView)){
SolftInputUtil.hideSoftInputFromWindow(this);
}
}
}catch (Exception e){
e.printStackTrace();
}
}
到这里代码就写完了,另外需要补充下辅助代码段
1.ViewUtils.isTouchView:判断当前触摸的是不是当前获取焦点的EditText
2.SolftInputUtil.hideSoftInputFromWindow:隐藏键盘
/**
* 是否触摸了当前焦点控件
* @param event
* @param focusView
* @return
*/
public static boolean isTouchView(MotionEvent event, View focusView){
if(null == event || null == focusView){
return false;
}
float x = event.getX();
float y = event.getY();
int[] outLocation = new int[2];
focusView.getLocationOnScreen(outLocation);
RectF rectF = new RectF(outLocation[0], outLocation[1] ,outLocation[0] + focusView.getWidth() ,outLocation[1] + focusView.getHeight());
if(x >= rectF.left && x <= rectF.right && y >= rectF.top && y <= rectF.bottom){
return true;
}
return false;
}
/**
* 隐藏Activity里面获得焦点的View的软键盘
*
* @param activity
*/
public static void hideSoftInputFromWindow(Activity activity) {
InputMethodManager parentImm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
if (parentImm.isActive()) {
View view = activity.getCurrentFocus();
if (null != view) {
parentImm.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}
}
}
代码随简单,希望也能帮到一部分朋友们。