Получение размеров мягкой клавиатуры

Есть ли способ узнать размер клавиатуры, отображаемой на экране?

Я использую Cocos2dx для программирования, но я хочу знать высоту клавиатуры, показанной на экране в части Android или части Cocos, это не имеет значения.

Я знаю, что Keyboard имеет метод getHeight(), но я не хочу создавать новые клавиатуры, я хочу использовать стандартный.

Ответ 1

Мы сделали это с этим

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

                @Override
                public void onGlobalLayout() {
                    // TODO Auto-generated method stub
                    Rect r = new Rect();
                    parent.getWindowVisibleDisplayFrame(r);

                    int screenHeight = parent.getRootView().getHeight();
                    int heightDifference = screenHeight - (r.bottom - r.top);
                    Log.d("Keyboard Size", "Size: " + heightDifference);

                    //boolean visible = heightDiff > screenHeight / 3;
                }
            });

Мы только изменяем размеры представлений с помощью клавиатуры, поэтому мы можем использовать это.

Ответ 2

Rect r = new Rect();
View rootview = this.getWindow().getDecorView(); // this = activity
rootview.getWindowVisibleDisplayFrame(r);

Результатом этого является объем пространства, которое ваше приложение использует на экране (работает, даже если размер не не изменяется). Очевидно, что оставшееся пространство экрана будет использоваться клавиатурой (если ее видно)

Найдено здесь: https://github.com/freshplanet/ANE-KeyboardSize/blob/master/android/src/com/freshplanet/ane/KeyboardSize/getKeyboardY.java

Ответ 3

если ваша деятельность не является полноэкранным, используя следующий код:

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

                @Override
                public void onGlobalLayout() {
                    // TODO Auto-generated method stub
                    if (keyBoardHeight <= 100) {
                        Rect r = new Rect();
                        content.getWindowVisibleDisplayFrame(r);

                        int screenHeight = content.getRootView()
                                .getHeight();
                        int heightDifference = screenHeight
                                - (r.bottom - r.top);
                        int resourceId = getResources()
                                .getIdentifier("status_bar_height",
                                        "dimen", "android");
                        if (resourceId > 0) {
                            heightDifference -= getResources()
                                    .getDimensionPixelSize(resourceId);
                        }
                        if (heightDifference > 100) {
                            keyBoardHeight = heightDifference;
                        }

                        Log.d("Keyboard Size", "Size: " + heightDifference);
                    }
                    // boolean visible = heightDiff > screenHeight / 3;
                }
            });

Ответ 4

Вы не можете сказать. Нет, на самом деле: вы просто не можете сказать.

Клавиатуре не обязательно должна быть какая-то особая форма. Его не нужно размещать в нижней части экрана (много наиболее популярные варианты не), он не должен сохранять свой текущий размер при изменении текстовых полей (почти никто не зависит от на флажках). Это даже не должно быть прямоугольник. Он также может просто взять на себя весь экран.

Ответ 5

Если вы хотите рассчитать высоту виртуальной клавиатуры, пока ваша деятельность не изменится в размере (adjustPan), вы можете использовать этот образец:

https://github.com/siebeprojects/samples-keyboardheight

Он использует скрытое окно, чтобы вычислить разницу высот между окном и корневым представлением активности.

Ответ 6

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

        final int[] discrepancy = new int[1];
        discrepancy[0] = 0;

        // this gets the height of the keyboard
        content.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {

            @Override
            public void onGlobalLayout() {
                Rect r = new Rect();
                View rootview = activity.getWindow().getDecorView(); // this = activity
                rootview.getWindowVisibleDisplayFrame(r);

                int screen_height = rootview.getRootView().getHeight();
                int keyboard_height = screen_height - (r.bottom + r.top) - discrepancy[0];

                if (discrepancy[0] == 0) {
                    discrepancy[0] = keyboard_height;
                    if (keyboard_height == 0) discrepancy[0] = 1;
                }

                int margin_bottom = keyboard_height + Helper.getDp(10, activity);

                RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) carousel_container.getLayoutParams();
                params.setMargins(0, 0, 0, margin_bottom);

                //boolean visible = heightDiff > screenHeight / 3;
            }
        });

Когда прослушиватель сначала называется, он измеряет экран без клавиатуры, и если есть несоответствие, я учитываю его в следующий раз. Если нет расхождений, я устанавливаю несоответствие 1 так, чтобы оно больше не 0.

Ответ 7

в cocos2d-x у нас есть CCEditBox.

Внутренние расширения- > GUI- > CCEditBox, вы можете найти класс CCEditBox.

Красота заключается в том, что она скрывает клавиатуру, постукивая куда-то еще на месте. и автоматически перемещает клавиатуру вверх, если ваше поле редактирования было слишком низким на сцене.

Если вы используете cocos2d-x v2.1.3, вы можете перейти к образцу Project, перейдя в

samples- > cpp- > TestCpp- > классы: > ExtensionTest- > EditBoxTest.

Теперь я буду использовать его вместо CCTextField. вчера натолкнулся на него:)

Ответ 8

ROOT_VIEW экрана дисплея Android может быть визуализирован как единый экран с VISIBLE DISPLAY FRAME, который отображает ваше представление активности.

Эта ВИДИМОЕ РАСПРЕДЕЛЕНИЕ ДИСПЛЕЯ настраивается при отображении или скрытии экрана SOFT KEYBOARD на экране.

ПРИМЕЧАНИЕ.. Посмотрите на два изображения, нажав на ссылки, приведенные ниже, для лучшего понимания.

Таким образом, просмотр ROOT VIEW на экране дисплея может быть представлен как: RootView экрана дисплея

Настройка VISIBLE DISPLAY FRAME с открытием и закрытием SOFT KEYBOARD может быть отображена как: настройка VISIBLE_DISPLAY_SCREEN

Эта настройка VISUAL DISPLAY FRAME может быть очень хорошо использована для определения высоты клавиатуры:

(когда открыта мягкая клавиатура)

SOFT_KEYBOARD_HEIGHT = ROOT_VIEW_HEIGHT - (VISUAL_DISPLAY_FRAME_HEIGHT + EXTRA_SCREEN_HEIGHT)

Код для достижения вышеуказанного:

int mExtraScreenHeight=-1, mKeyboardHeight=-1;
boolean mKeyboardOpen;



    rootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {

            int rootViewHeight, visibleDisplayFrameHeight, fakeHeight;

            /* (rootViewHeight - visibleDisplayFrameHeight) is not the real height of the keyboard
                it is the fake height as it also consist of extra screen height
                so FAKE_HEIGHT = KEYBOARD_HEIGHT + EXTRA_SCREEN_HEIGHT

                To get keyboard height extra screen height must be removed from fake height
             */

            Rect rect = new Rect();
            rootView.getWindowVisibleDisplayFrame(rect);

            rootViewHeight = rootView.getRootView().getHeight();
            visibleDisplayFrameHeight = rect.height();

            fakeHeight = rootViewHeight-visibleDisplayFrameHeight;

            if (mExtraScreenHeight == -1){
                mExtraScreenHeight=fakeHeight;
            }
            /* Suppose the soft keyboard is open then the VISIBLE_DISPLAY_FRAME is in reduced size
                due to the space taken up by extra screen and the keyboard but when the soft keyboard closes
                then KEYBOARD_HEIGHT=0 and thus FAKE_HEIGHT = EXTRA_SCREEN_HEIGHT
             */
            else if (fakeHeight <= mExtraScreenHeight){
                mExtraScreenHeight=fakeHeight;
                mKeypadOpen=false;
            }
            else if (fakeHeight > mExtraScreenHeight){
                mKeypadHeight=fakeHeight-mExtraScreenHeight;
                mKeypadOpen=true;
            }
        }
    });

ПРИМЕЧАНИЕ. Функция onGlobalLayout() будет вызываться только при изменении глобального макета, например, при открытии мягкой клавиатуры. Поэтому мягкая клавиатура должна быть открыта хотя бы один раз, чтобы получить высоту мягкой клавиатуры.

Это сработало для меня;)

Ответ 9

Извините за невозможность комментировать, два или три ответа помогли мне решить мою проблему, и они были связаны с использованием AddOnGlobalLayoutListener, а затем определения оставшейся высоты до и после появления клавиатуры.

Решение, которое я использовал, основывалось на ответе Rudy_TM.

ОДНАКО, одна вещь, которую я должен был найти, заключалась в том, что для того, чтобы этот метод работал, у вас должна быть следующая строка

Window.SetSoftInputMode(SoftInput.AdjustResize);

До того, как я получил SoftInput.AdjustNothing(или что-то в этом роде), и это не сработает. Теперь он работает отлично. Спасибо за ответы!

Ответ 10

После нескольких часов поиска я нашел решение , если вы хотите установить windowSoftInput="adjustPan"

Вот фрагмент кода:

    final View root  = findViewById(android.R.id.content);
    root.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    Rect r = new Rect();
    {
        root.getWindowVisibleDisplayFrame(r);
    }
    @Override
    public void onGlobalLayout() {
        Rect r2 = new Rect();
        root.getWindowVisibleDisplayFrame(r2);
        int keyboardHeight = r.height() - r2.height();
        if (keyboardHeight > 100) {
            root.scrollTo(0, keyboardHeight);
        }
        else {
            root.scrollTo(0, 0);
        }
    }
});

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

В соответствии с docs:

void getWindowVisibleDisplayFrame(Rect outRect): получить общий видимый размер отображения, в котором было помещено окно, в которое было добавлено это представление.