直接在Activity中覆写如下方法:
@Override
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) { //没有View处理该事件,点击到了不可点击区域
hideSoftKeyBoard();
if (DEBUG) {
LogHelper.d(TAG, "touch event : down!");
}
}
return super.onTouchEvent(event);
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
downX = (int) ev.getX();
showSoftInputOnFocus(true);
if (DEBUG) {
LogHelper.d(TAG, "dispatchTouchEvent() : down!");
}
break;
case MotionEvent.ACTION_MOVE:
int distanceX = Math.abs(downX - (int) ev.getX());
if (distanceX >= INTERCEPT_X_DISTANCE) {
if (DEBUG) {
LogHelper.d(TAG, "is interceptEvent!!");
}
hideSoftKeyBoard();
//防止与EditText冲突再次弹出键盘
showSoftInputOnFocus(false);
return true;
}
mNumberEdit.setInputType(InputType.TYPE_CLASS_NUMBER);
break;
case MotionEvent.ACTION_UP:
if (DEBUG) {
LogHelper.d(TAG, "dispatchTouchEvent() : up!");
}
downX = 0;
mNumberEdit.setText(mNumberEdit.getText());
mNumberEdit.setSelection(mNumberEdit.getText().toString().length());
break;
default:
break;
}
return super.dispatchTouchEvent(ev);
}
private void hideSoftKeyBoard() {
InputMethodManager inputMethodManager = (InputMethodManager)
getSystemService(Context.INPUT_METHOD_SERVICE);
if (inputMethodManager != null) {
if (inputMethodManager.isActive()) {
inputMethodManager.hideSoftInputFromWindow(mNumberEdit.getWindowToken(), 0);
}
}
}
private void showSoftInputOnFocus(boolean show) { //设置EditText在获得焦点时是否显示键盘
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
mNumberEdit.setShowSoftInputOnFocus(show);
} else {
String methodName = null;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
methodName = "setShowSoftInputOnFocus";
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
methodName = "setSoftInputShownOnFocus";
}
if (methodName == null) {
mNumberEdit.setInputType(InputType.TYPE_NULL);
return;
}
try {
final Method method = EditText.class.getMethod(methodName, boolean.class);
method.setAccessible(true);
method.invoke(mNumberEdit, show);
} catch (Exception e) {
if (DEBUG) {
LogHelper.d(TAG, e.toString());
}
}
}
}