/** * 设置滑动隐藏键盘的操作 *parentView 最外层的父布局,主要用于隐藏键盘 *mSendText,某个按钮,比如发送按钮,避免也当隐藏键盘处理,不过这里isShouldHideKeyboard限制了只能进入EditText,所以暂时不起作用,有要做处理的可以把isShouldHideKeyboard 的 if (v != null && (v instanceof EditText))优化以下 */ public boolean setDisTouchHidKeyBord(MotionEvent ev, View parentView, TextView mSendText, Context context) { if (ev.getAction() == MotionEvent.ACTION_DOWN) { View v = getCurrentFocus(); if (AppUtil.isShouldHideKeyboard(v, ev)) { AppUtil.hideKeyboard(v.getWindowToken(), parentView, context); if (mSendText==null)return super.dispatchTouchEvent(ev); if (!AppUtil.isShouldHideKeyboard(mSendText, ev)) { return super.dispatchTouchEvent(ev); } return true; } } else if (ev.getAction() == MotionEvent.ACTION_MOVE) { View v = getCurrentFocus(); AppUtil.hideKeyboard(v.getWindowToken(), parentView, context); } return super.dispatchTouchEvent(ev); }
/** * 根据EditText所在坐标和用户点击的坐标相对比(这里都是相对于屏幕),来判断是否隐藏键盘,因为当用户点击EditText时则不能隐藏 * * @param v * @param event * @return */ public static boolean isShouldHideKeyboard(View v, MotionEvent event) { if (v != null && (v instanceof EditText)) {//如果edittext获取焦点的时候 int[] l = {0, 0}; v.getLocationInWindow(l); int left = l[0], top = l[1], bottom = top + v.getHeight(), right = left + v.getWidth(); /* LogUtil.e("left=+"+left); LogUtil.e("top=+"+top); LogUtil.e("bottom=+"+bottom); LogUtil.e("right=+"+right); LogUtil.e("event.getX()=+"+event.getRawX()); LogUtil.e("event.getY()=+"+event.getRawY());*/ if (event.getRawX() > left && event.getRawX() < right && event.getRawY() > top && event.getRawY() < bottom) { // 点击EditText的事件,忽略它。 return false; } else { return true; } } // 如果焦点不是EditText则忽略,这个发生在视图刚绘制完,第一个焦点不在EditText上,和用户用轨迹球选择其他的焦点 return false; }
/** * 获取InputMethodManager,隐藏软键盘 * @param token */ public static void hideKeyboard(IBinder token, View parentView, Context context) { if (token != null) { parentView.setFocusable(true); parentView.setFocusableInTouchMode(true); parentView.requestFocus(); InputMethodManager im = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); im.hideSoftInputFromWindow(token, InputMethodManager.HIDE_NOT_ALWAYS); } }
//在activity中调用
@Override public boolean dispatchTouchEvent(MotionEvent ev) { return setDisTouchHidKeyBord(ev,parentView,null,BankOrderActivity.this); }