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

han*_*ang 13 android android-softkeyboard

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

Ari*_*Roy 6

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

您可以检查库或库,它们已经实现了您正在寻找的内容.

在此输入图像描述

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

最初定义键盘高度,

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

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

/**
     * 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;

                        }

                    }
                });

    }
Run Code Online (Sandbox Code Playgroud)

并且此方法根据实际键盘高度更改表情符号键盘高度,

/**
     * 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);
        }

    }
Run Code Online (Sandbox Code Playgroud)

我已经按照这种方法得到了我想要的.我相信您可以根据应用的要求实施此功能.

希望能帮助到你.


Mic*_*ael 1

TYPE_SYSTEM_ALERT窗口在某些设备上根本不起作用,但如果它们起作用,则应将其放置在 IME 窗口上方。我建议你尝试一下TYPE_TOASTwindows。Toast 适用于所有设备,并显示在键盘上方。但在某些 Android 版本(例如 4.1)上,Toast 不接受用户输入,例如触摸或按键事件。

TYPE_PHONE也可能是解决您的问题的一个很好的选择,但我认为它不适用于TYPE_SYSTEM_ALERT无法工作的设备。

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

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