Android 如何正确获取浮动窗口中的软键盘高度

Android 如何正确获取浮动窗口中的软键盘高度,android,Android,在这里,我通过将LayoutChangeListener添加到根视图,尝试在全屏模式浮动窗口中测量软键盘,如下所示: mOnLayoutChangeListner = new View.OnLayoutChangeListener() { @Override public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop,

在这里,我通过将LayoutChangeListener添加到根视图,尝试在全屏模式浮动窗口中测量软键盘,如下所示:

   mOnLayoutChangeListner = new View.OnLayoutChangeListener() {
        @Override
        public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
            Rect r = getFrameVisiblePart();
            if (isMayBeKeyBoard(r)) {
                onKeyBoardShow(r.bottom, screenHeight - r.bottom);
            } else if (isKeyBoardMaybeHide(r)) {
                onKeyBoardHide();
            }
        }
    };
    mRootView.addOnLayoutChangeListener(mOnLayoutChangeListner);
getFrameVisiblePart:

 private Rect getFrameVisiblePart() {
    Rect r = new Rect();
    mRootView.getWindowVisibleDisplayFrame(r);
    return r;
}
下面是窗口参数:

Context context = App.getInstance();
    WindowManager.LayoutParams params = new WindowManager.LayoutParams();

    if (Build.VERSION.SDK_INT >= 19) { 
        Point p = new Point();
        manager.getDefaultDisplay().getRealSize(p);
        params.width = WindowManager.LayoutParams.MATCH_PARENT;
        params.height = (p.y > p.x ? p.y : p.x);
        params.gravity = Gravity.TOP;
        params.flags = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS
                | WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION
                | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS
                | WindowManager.LayoutParams.FLAG_FULLSCREEN
                | WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED
                | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
                | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
        ;
    } else {
        params.width = WindowManager.LayoutParams.MATCH_PARENT;
        params.height = WindowManager.LayoutParams.MATCH_PARENT;
        params.flags = WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM
                | WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED
                | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
        ;
    }
    params.type = WindowManager.LayoutParams.TYPE_SYSTEM_ERROR
一切都很顺利。但由于类型为SYSTEM_ERROR,无法单击导航栏中的返回和主页按钮。我尝试将类型更改为类型\系统\警报,然后测量功能不起作用。onLayoutChange函数仅在窗口首次显示和更改窗口的子视图的视图可见性时调用,getFrameVisiblePart()函数返回可见区域而不返回预期值