android 获取键盘高度和键盘是否弹出

2018-03-07  本文已影响0人  念念不忘_2016

转自 https://www.jianshu.com/p/4c7703361835

原理

软键盘弹出时,布局会进行调整,这时只要我们监听到跟布局的高度和可是区域的高度后,他们的差值就是软件盘的高度。要获取我们需要的条件要依靠这两位哥们ViewTreeObserver.OnGlobalLayoutListener和getWindowVisibleDisplayFrame(rect)

福利区

private static boolean isFirst = true;

public interface OnGetSoftHeightListener {
    void onShowed(int height);
}
public interface OnSoftKeyWordShowListener {
    void hasShow(boolean isShow);
}

/** * 获取软键盘的高度 * *
 @param rootView *
 @param listener
 */
public static void getSoftKeyboardHeight(final View rootView, final OnGetSoftHeightListener listener) {
    final ViewTreeObserver.OnGlobalLayoutListener layoutListener
            = new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            if (isFirst) {
                final Rect rect = new Rect();
                rootView.getWindowVisibleDisplayFrame(rect);
                final int screenHeight = rootView.getRootView().getHeight();
                final int heightDifference = screenHeight - rect.bottom;
//设置一个阀值来判断软键盘是否弹出
                boolean visible = heightDifference > screenHeight / 3;
                if (visible) {
                    isFirst = false;
                    if (listener != null) {
                        listener.onShowed(heightDifference);
                    }
                    rootView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
                }
            }
        }
    };
    rootView.getViewTreeObserver().addOnGlobalLayoutListener(layoutListener);
}



/** * 判断软键盘是否弹出
 * * @param rootView
 * @param listener
 *备注:在不用的时候记得移除OnGlobalLayoutListener
 */
public ViewTreeObserver.OnGlobalLayoutListener doMonitorSoftKeyWord(final View rootView, final OnSoftKeyWordShowListener listener) {
    final ViewTreeObserver.OnGlobalLayoutListener layoutListener = new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            final Rect rect = new Rect();
            rootView.getWindowVisibleDisplayFrame(rect);
            final int screenHeight = rootView.getRootView().getHeight();
            LogUtil.e("TAG",rect.bottom+"#"+screenHeight);
            final int heightDifference = screenHeight - rect.bottom;
            boolean visible = heightDifference > screenHeight / 3;
            if (listener != null)
                listener.hasShow(visible);
        }
    };
    rootView.getViewTreeObserver().addOnGlobalLayoutListener(layoutListener);
    return layoutListener;
}

@Override
protected void onDestroy() {
    super.onDestroy();
//这里对监听器进行移除
    if (softkeyListener != null){
     findViewById(R.id.rl_main).getViewTreeObserver().removeOnGlobalLayoutListener(softkeyListener);
    }
}
上一篇 下一篇

猜你喜欢

热点阅读