Я буду использовать код, предоставленный по ссылке, которую вы разместили:
// 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)
:
Отправка события указателя.Завершено в какой-то момент после того, как получатель вернулся с обработки события, хотя, возможно, он еще не полностью завершил реакцию на событие - например, если ему нужно обновить свой дисплей в результате, он все еще может находиться в процессе выполненияэто.