Узнать состояние клавиатуры в Lollipop

334
05 августа 2017, 03:20

Так получилось, что InputMethodManager не хранит в себе текущее состояние клавиатуры, под "состояние" подразумевается видна или не видна системная клава. Есть код, который работает на всех версиях кроме Lollipopa.

/**
     * It checks that keyboard is showing now.
     *
     * @return {@code true} if keyboard is showing, {@code false} otherwise.
     */
    public static boolean isKeyboardShown() {
        InputMethodManager imm = (InputMethodManager) solo.getCurrentActivity().getSystemService(
                Context.INPUT_METHOD_SERVICE);
        // Software keyboard can be opened only if InputMethodManager exists and active for current context.
        if (imm != null && imm.isActive() && isKeyboardActive) {
            // In "full screen edit mode" keyboard is shown.
            if (UIHelpers.isFullscreenEditMode())
                return true;
            // If diff between screen height and android:id/content view height more than 0 then keyboard is shown.
            if (VIEW_CONTENT_WITHOUT_KEYBOARD.isVisible() && getKeyboardHeightRelativeToAndroidContent() != 0)
                return true;
            // If opened dialog and shift more than 2px then keyboard shown. Value of 2px is permissible error of method getDialogShift().
            if (DialogHelpers.getDialogShift() > 2) {
                return true;
            }
        }
        return false;
    }

абсолютно всегда возвращает true

imm != null && imm.isActive() 

но в lollipope еще и возвращает true вот это условие

if (VIEW_CONTENT_WITHOUT_KEYBOARD.isVisible() && 
    getKeyboardHeightRelativeToAndroidContent() != 0)

где

/**
     * Returns the height of keyboard as difference between "android:id/content" view height and bottom of used {@link
     * android.view.Window}. Returns height only if it more than {@link #MINIMUM_KEYBOARD_HEIGHT} for platform less
     * then "Marshmallow". For "Marshmallow" platform returns real height of keyboard.
     * NOTE: not working in fullscreen edit mode and for dialogs (always returns {@code 0}).
     *
     * @return Height of keyboard (in pixels).
     */
    public static int getKeyboardHeightRelativeToAndroidContent() {
        View contentView = VIEW_CONTENT_WITHOUT_KEYBOARD.assertExists();
        Rect rect = new Rect();
        contentView.getWindowVisibleDisplayFrame(rect);
        if (isAndroidMarshmallowOrNewer()) {
            //Note: contentView.getRootView() return full height of screen with navigation bar for marshmallow platform
            //but for less platform without navigation bar.
            return ((View) contentView.getParent().getParent()).getHeight() - rect.bottom;
        } else {
            int height = contentView.getRootView().getHeight() - rect.bottom;
            return height > MINIMUM_KEYBOARD_HEIGHT ? height : 0;
        }
    }

Метод подсмотрен на англоязычном SO. Так вот вопрос: есть ли у кого какие-нибудь предложения как правильней хранить состояние клавиатуры? Булин флаг не устраивает, послкольку проект это фреймворк для тестирования приложений, и програмно клавиатура не всегда открывается/закрывается, т.е. используя свои методы hideKeyBoard/openKeyBoard

READ ALSO
Ошибка при повторной покупке монет

Ошибка при повторной покупке монет

У меня имеется список с разными количествами монетТипа этого:

326
Закрепить позицию в ScrollView

Закрепить позицию в ScrollView

Возможно ли как то чтобы в разметке, содержащую ScrollView сделать так чтобы он не пролистывался вниз, дело в том что видимо какой то баг, при переходе...

271
Почему не считывает double переменные с консоли?

Почему не считывает double переменные с консоли?

С консоли нужно считать переменную типа double, затем умножить ее на 6, округлить в меньшую сторону, результат поместить в переменную типа int и вывести...

330
Android: выбор файла

Android: выбор файла

Нужно реализовать такую фишку: приложение просит выбрать в файлах изображение,с помощью установленных программ (например "Мои файлы"),чтобы...

286