在Lollipop获得键盘高度

sta*_*dan 5 keyboard height android android-4.4-kitkat android-5.0-lollipop

Lollipop关于键盘高度的变化是什么?

我有一个方法,使用getViewTreeObserver()正确的方法返回Lollipop之前的每个版本的键盘高度(在ldpi,mdpi,hdpi和xhdpi测试 - 没有问题)但似乎在Lollipop上返回的高度比真正的键盘大一点点高度.

在我的华硕Nexus 7上,我的高度比实际高度大约70 px.

有人知道如何在Lollipop上获得真正的键盘高度吗?

iAv*_*ose 3

当键盘打开时尝试以下代码。

@TargetApi(Build.VERSION_CODES.HONEYCOMB_MR2)
public int calculateScreenHeightForLollipop() {
    WindowManager wm = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
    Display display = wm.getDefaultDisplay();
    Point size = new Point();
    display.getSize(size);
    return size.y;
}

/**
 * Call this function to resize the emoji popup according to your soft keyboard size
 */
public void setSizeForSoftKeyboard() {
    rootView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            Rect r = new Rect();
            rootView.getWindowVisibleDisplayFrame(r);
            int screenHeight;
            if (Build.VERSION.SDK_INT >= 5.0) {
                screenHeight = calculateScreenHeightForLollipop();
            } else {
                screenHeight = rootView.getRootView().getHeight();
            }
            int heightDifference = screenHeight
                    - (r.bottom - r.top);
            int resourceId = mContext.getResources()
                    .getIdentifier("status_bar_height",
                            "dimen", "android");
            if (resourceId > 0) {
                heightDifference -= mContext.getResources()
                        .getDimensionPixelSize(resourceId);
            }
            if (heightDifference > 100) {
                keyBoardHeight = heightDifference;
                setSize(LayoutParams.MATCH_PARENT, keyBoardHeight);
                if (!isOpened) {
                    if (onSoftKeyboardOpenCloseListener != null)
                        onSoftKeyboardOpenCloseListener.onKeyboardOpen(keyBoardHeight);
                }
                isOpened = true;
                if (pendingOpen) {
                    showAtBottom();
                    pendingOpen = false;
                }
            } else {
                isOpened = false;
                if (onSoftKeyboardOpenCloseListener != null)
                    onSoftKeyboardOpenCloseListener.onKeyboardClose();
            }
        }
    });
}
Run Code Online (Sandbox Code Playgroud)