Как отправить указатель на событие в Android - PullRequest
7 голосов
/ 22 декабря 2011

Я пытаюсь определить высоту виртуальной клавиатуры в Android.

Я нашел похожую тему: Получить высоту виртуальной клавиатуры в Android

Кажетсяавтор нашел способ определения высоты:

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

Я не понимаю, как это сделать.

Ответы [ 2 ]

3 голосов
/ 24 сентября 2013

Я буду использовать код, предоставленный по ссылке, которую вы разместили:

// Declare Variables

int softkeyboard_height = 0;
boolean calculated_keyboard_height;
Instrumentation instrumentation;

// Initialize instrumentation sometime before starting the thread
instrumentation = new Instrumentation();

mainScreenView - это ваш базовый вид, вид вашей активности.m (ACTION_DOWN) и m1 (ACTION_UP) - это события касания, которые отправляются с использованием Instrumentation#sendPointerSync(MotionEvent).Логика заключается в том, что отправка MotionEvent туда, где отображается клавиатура, вызовет следующее SecurityException:

java.lang.SecurityException: для внедрения в другое приложение требуется разрешение INJECT_EVENTS

Итак, мы начинаем с нижней части экрана и продвигаемся вверх (уменьшая y) на каждой итерации цикла.Для определенного количества итераций мы получим исключение SecurityException (которое мы поймаем): это будет означать, что MotionEvent происходит через клавиатуру.В тот момент, когда y станет достаточно маленьким (когда он чуть выше клавиатуры), мы вырвемся из цикла и рассчитаем высоту клавиатуры, используя:

softkeyboard_height = mainScreenView.getHeight() - y;

Код:

Thread t = new Thread(){
        public void run() {
            int y = mainScreenView.getHeight()-2;
            int x = 10;
            int counter = 0;
            int height = y;
            while (true){
                final MotionEvent m = MotionEvent.obtain(
                        SystemClock.uptimeMillis(),
                        SystemClock.uptimeMillis(),
                        MotionEvent.ACTION_DOWN,
                        x, 
                        y,
                        1);
                final MotionEvent m1 = MotionEvent.obtain(
                        SystemClock.uptimeMillis(),
                        SystemClock.uptimeMillis(),
                        MotionEvent.ACTION_UP,
                        x, 
                        y,
                        1);
                boolean pointer_on_softkeyboard = false;
                try {
                    instrumentation.sendPointerSync(m);
                    instrumentation.sendPointerSync(m1);
                } catch (SecurityException e) {
                    pointer_on_softkeyboard = true;
                }
                if (!pointer_on_softkeyboard){
                    if (y == height){
                        if (counter++ < 100){
                            Thread.yield();
                            continue;
                        }
                    } else if (y > 0){
                        softkeyboard_height = mainScreenView.getHeight() - y;
                        Log.i("", "Soft Keyboard's height is: " + softkeyboard_height);
                    }
                    break;
                }
                y--;

            }
            if (softkeyboard_height > 0 ){
                // it is calculated and saved in softkeyboard_height
            } else {
                calculated_keyboard_height = false;
            }
        }
    };
    t.start();

Instrumentation#sendPointerSync(MotionEvent):

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

1 голос
/ 28 сентября 2013

Используйте OnGlobalLayoutListener, он отлично работает для меня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...