четверг, 22 ноября 2012 г.

Android: Создание обработчика(listener) для вызова экранной клавиатуры

    В процессе работы над приложением передо мной встала задача: отследить открытие и закрытие пользователем экранной клавиатуры. При открытой клавиатуре была видна только половина экрана, поэтому в момент выползания клавиатуры у меня включалась возможность вертикального скролла, но реализация этого - тема для отдельной статьи =)
 
    Итак, наша задача:
  • отследить открытие пользователем экранной клавиатуры
    В Android не предусмотрено каких-либо стандартных методов, отслеживающих открытие клавиатуры, то есть нам придётся писать свою реализацию.
    По каким параметрам можно определить, что клавиатура открыта? Сразу приходит на ум одно явное изменение - изменилась видимая область экрана. Нижнюю часть теперь скрывает клавиатура. Попробуем отследить изменение видимой области.
    Вот полная реализация кода отслеживания изменения размеров видимой области:

final View activityRootView = findViewById(android.R.id.content);
activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
public void onGlobalLayout() {
     Rect r = new Rect();
     //создаём прямоугольник r с координатами видимого пространства
     activityRootView.getWindowVisibleDisplayFrame(r);

     //Вычисляем разницу между высотой нашего View и высотой видимого пространства
     int heightDiff = activityRootView.getRootView().getHeight() - (r.bottom - r.top);
     if (heightDiff > 100) { // Если разница > 100px, то скорее всего открыта клавиатура
     //Пишем тут необходимые действия и выводим в лог высоту View, высоту видимой области и их разность.
     Log.d("mylog","rootHeight = " + activityRootView.getRootView().getHeight());
     Log.d("mylog","(r.bottom - r.top) = " + (r.bottom - r.top));

     Log.d("mylog","heightDiff = " + heightDiff);
     }
   }
});


    Мы назначаем для нашего activity OnGlobalLayoutListener. Он отслеживает изменение видимой части экрана - как раз то, что нам нужно. Мы создаём прямоугольник с координатами видимого пространства, а также имеем доступ к высоте нашего RootView с помощью .getRootView().getHeight(). Узнав разницу между этими двумя значениями, мы всегда сможем определить, что открыта экранная клавиатура.

Комментариев нет:

Отправить комментарий