如何确保窗口始终显示在软键盘上方?

时间:2015-07-07 10:36:35

标签: android android-softkeyboard

我使用TYPE_APPLICATION_PANEL在软键盘上面添加一个WindowManager视图,但它不能在某些手机上工作,也不适用于TYPE_SYSTEM_ALERT。我该怎么做才能在所有手机上实现?

2 个答案:

答案 0 :(得分:6)

是的,这可以通过软键盘上的PopupWindow来完成。

您可以查看this库或this库,它们已经完全按照您的要求进行了实施。

enter image description here

他们在键盘上添加了自定义视图。您只需按照其实施模式轻松添加视图即可。 我还想强调一些重要的代码

最初定义键盘高度,

        // Defining default height of keyboard which is equal to 230 dip
        final float popUpheight = getResources().getDimension(
                R.dimen.keyboard_height);
        changeKeyboardHeight((int) popUpheight);

此方法用于动态检查键盘高度及其可见性,

/**
     * Checking keyboard height and keyboard visibility
     */
    int previousHeightDiffrence = 0;
    private void checkKeyboardHeight(final View parentLayout) {

        parentLayout.getViewTreeObserver().addOnGlobalLayoutListener(
                new ViewTreeObserver.OnGlobalLayoutListener() {

                    @Override
                    public void onGlobalLayout() {

                        Rect r = new Rect();
                        parentLayout.getWindowVisibleDisplayFrame(r);

                        int screenHeight = parentLayout.getRootView()
                                .getHeight();
                        int heightDifference = screenHeight - (r.bottom);

                        if (previousHeightDiffrence - heightDifference > 50) {                          
                            popupWindow.dismiss();
                        }

                        previousHeightDiffrence = heightDifference;
                        if (heightDifference > 100) {

                            isKeyBoardVisible = true;
                            changeKeyboardHeight(heightDifference);

                        } else {

                            isKeyBoardVisible = false;

                        }

                    }
                });

    }

此方法根据实际键盘高度

更改表情符号键盘高度
/**
     * change height of emoticons keyboard according to height of actual
     * keyboard
     * 
     * @param height
     *            minimum height by which we can make sure actual keyboard is
     *            open or not
     */
    private void changeKeyboardHeight(int height) {

        if (height > 100) {
            keyboardHeight = height;
            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
                    LayoutParams.MATCH_PARENT, keyboardHeight);
            emoticonsCover.setLayoutParams(params);
        }

    }

我遵循了这种方法,并且完全符合我的要求。我相信您可以根据应用的要求实施此功能。

希望它有所帮助。

答案 1 :(得分:1)

TYPE_SYSTEM_ALERT窗口根本无法在某些设备上运行,但如果它们工作,则应将它们放在IME窗口上方。我建议你试试TYPE_TOAST个窗口。 Toasts可在所有设备上运行,并显示在键盘上方。但是在4.1版Toast等Android版本中,不接受用户输入,如触摸或键事件。

TYPE_PHONE也可能是解决问题的好方法,但我认为它不适用于TYPE_SYSTEM_ALERT无效的设备。

更新:您可以尝试的另一件事是将WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM添加到WindowManager.LayoutParams.flags。这个标志告诉Android定位一个窗口,以便它可以覆盖IME。在这种情况下,必须取消设置WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE标志。在此配置中,窗口将是可聚焦的,应位于IME前面。

另一种选择是仅设置WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE标志并设置WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM标志。它还会使您的窗口位于IME前面,但窗口将无法调焦。