/**     * 判断键盘是否隐藏     */    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() {                        @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;    }


更多相关文章

  1. android 获取局域网内其他手机的ip
  2. Android(安卓)获取无线蓝牙MAC信息代码
  3. Android监听键盘上的确定键等
  4. Android获取WiFi ip相关信息
  5. Android工具类
  6. Android获取应用的签名信息
  7. android 获取屏幕分辨率
  8. android AlertDialog自定义大小
  9. Android高仿QQ下拉刷新

随机推荐

  1. Android验证码读取
  2. Android版本和API Level , ADT对应关系
  3. Android(安卓)Option Menu
  4. Android检测网络连接
  5. android getIdentifier的使用
  6. Android(安卓)- How-to Rebuild gdbserve
  7. Android:Parcelable/Bundle/IBinder
  8. minSdkVersion各个版本号对应android版本
  9. android添加广告之--admob
  10. Android中的背景音频与MediaSessionCompa