Как узнать, активна ли на телефоне клавиатура и какова её высота (android 8++)?

Для того чтобы узнать, активна ли на телефоне клавиатура, а также узнать ее высоту, вам понадобится использовать классы и методы из Android API.

1. Получение состояния клавиатуры

Для определения состояния клавиатуры мы можем использовать слушатель событий, предоставляемых Android Framework. Для этого нужно добавить слушатель ViewTreeObserver.OnGlobalLayoutListener к главному представлению (например, LinearLayout). Примените следующий код:

View mainView = getWindow().findViewById(R.id.main_layout); // замените R.id.main_layout на id вашего главного представления
mainView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        Rect r = new Rect();
        mainView.getWindowVisibleDisplayFrame(r);
        int screenHeight = mainView.getRootView().getHeight();

        // Высота скрывающейся клавиатуры
        int keyboardHeight = screenHeight - r.bottom;

        // Проверяем, активна ли клавиатура
        boolean isKeyboardShown = keyboardHeight > screenHeight * 0.15; // 0.15 - это процентная часть, которую считаем достаточно большой для определения активности клавиатуры

        // Действия при получении состояния клавиатуры
        if (isKeyboardShown) {
            // Клавиатура отображается
        } else {
            // Клавиатура скрыта
        }
    }
});

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

2. Получение высоты клавиатуры

Высота клавиатуры может быть получена с помощью вычитания координат r.bottom от высоты корневого представления screenHeight. Затем это значение (keyboardHeight) может использоваться для выполнения необходимых задач, таких как изменение размера элементов пользовательского интерфейса или анимации.

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