/** * 判断键盘是否隐藏 */ void setViewTreeObserver() { final ViewTreeObserver observer = parent.getViewTreeObserver(); observer.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { Rect rect = new Rect(); parent.getWindowVisibleDisplayFrame(rect); //获取除去状态栏之外的屏幕高度 // LogUtils.info("--> rect " + rect.top + " " + rect.bottom + " " + rect.left + " " + rect.right); int statusBarH = getStatusBarHeight(); //获取状态栏高度 // LogUtils.info("--> statusBarH " + statusBarH); int screenH = parent.getRootView().getHeight(); //获取屏幕高度 // LogUtils.info("--> screenH " + screenH); if (rect.top != statusBarH) { //在这个demo中r.top代表的是状态栏高度,在沉浸式状态栏时r.top=0,通过getStatusBarHeight获取状态栏高度 rect.top = statusBarH; //避免沉浸式状态栏的情况下获取的top=0 } int keyboardH = screenH - (rect.bottom - rect.top); //获取当前可能的键盘高度 keyboardH != statusBarH的时候即可能键盘出现 // LogUtils.info("--> keyboardH " + keyboardH); // Log.d(TAG, "screenH= "+ screenH +" &keyboardH = " + keyboardH + " &r.bottom=" + r.bottom + " &top=" + r.top + " &statusBarH=" + statusBarH); if (keyboardH == mCurrentKeyboardH) {//有变化时才处理,否则会陷入死循环 return; } mCurrentKeyboardH = keyboardH; // LogUtils.info("--> mCurrentKeyboardH " + mCurrentKeyboardH); mScreenHeight = screenH;//应用屏幕的高度 // mEditTextBodyHeight = edittextbody.getHeight(); // TODO: 2017/1/5 if (keyboardH < 150) {//说明是隐藏键盘的情况 LogUtils.info("--> 隐藏键盘"); Observable.timer(200, TimeUnit.MILLISECONDS).observeOn(AndroidSchedulers.mainThread()).subscribe(new Action1<Long>() { @Override public void call(Long aLong) { ib_recommend.setVisibility(View.VISIBLE); } }); return; } else { LogUtils.info("--> 显示键盘"); ib_recommend.setVisibility(View.GONE); } } }); } /** * 获取状态栏高度 * * @return */ private int getStatusBarHeight() { int result = 0; int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android"); if (resourceId > 0) { result = getResources().getDimensionPixelSize(resourceId); } return result; } @Override public boolean dispatchTouchEvent(MotionEvent ev) { if (ev.getAction() == MotionEvent.ACTION_DOWN) { View v = getCurrentFocus(); if (isShouldHideInput(v, ev)) { InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); if (imm != null) { imm.hideSoftInputFromWindow(v.getWindowToken(), 0); } } return super.dispatchTouchEvent(ev); } // 必不可少,否则所有的组件都不会有TouchEvent了 if (getWindow().superDispatchTouchEvent(ev)) { return true; } return onTouchEvent(ev); } /** * 判断键盘是否应该隐藏 * 点击除EditText的区域隐藏 * @param v * @param event * @return */ public boolean isShouldHideInput(View v, MotionEvent event) { if (v != null && (v instanceof EditText)) { int[] leftTop = {0, 0}; //获取输入框当前的location位置 v.getLocationInWindow(leftTop); int left = leftTop[0]; int top = leftTop[1]; int bottom = top + v.getHeight(); int 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; }
android朋友圈监听键盘状态 点击空白区域隐藏键盘
最新推荐文章于 2021-10-30 17:10:14 发布