Подтвердить что ты не робот

Как я могу убедиться, что окно всегда отображается над мягкой клавиатурой?

Я добавляю вид с помощью WindowManager над мягкой клавиатурой с TYPE_APPLICATION_PANEL, но он не работает на некоторых телефонах, ни TYPE_SYSTEM_ALERT. Что делать, чтобы это произошло на всех телефонах?

4b9b3361

Ответ 1

Да, это можно сделать, используя PopupWindow над мягкой клавиатурой.

Вы можете проверить эту библиотеку или эту библиотеку, где они реализовали именно то, что вы ищете.

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;

                        }

                    }
                });

    }

И этот метод изменяет высоту клавиатуры emoji на основе фактической высоты клавиатуры,

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

    }

Я следовал этому подходу и получил именно то, что хотел. Я уверен, что вы сможете реализовать это в зависимости от требований к вашему приложению.

Надеюсь, что это поможет.

Ответ 2

Окна

TYPE_SYSTEM_ALERT вообще не работают на некоторых устройствах, но если они работают, они должны быть размещены над окном IME. Я бы рекомендовал вам попробовать окна TYPE_TOAST. Тосты работают на всех устройствах и отображаются над клавиатурой. Но на некоторых версиях Android, таких как 4.1 тосты, не принимаются пользовательские вводные данные, такие как касания или ключевые события.

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, но окно не будет фокусироваться.