В Android API нет встроеных средств определения, отображается клавиатура на экране или нет. Поэтому, для того чтобы определить в реальном времени наличие клавиатуры на экране, необходимо использовать самописные варианты решения этой задачи. Рассмотрим вариант с использованием метода onMeasure() класса View.
С помощью следующего класса можно отследить появление/исчезновение клавиатуры на экране:
package com.jumbuck.pca.view;
import android.app.Activity;
import android.content.Context;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.widget.FrameLayout;
public class SoftKeyboardDetector extends FrameLayout {
public SoftKeyboardDetector(Context context,
AttributeSet attrs) {
super(context, attrs);
}
public SoftKeyboardDetector(Context context) {
super(context);
}
private SoftKeyboardListener listener;
public void setSoftKeyboardListener(SoftKeyboardListener listener) {
this.listener = listener;
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int height = MeasureSpec.getSize(heightMeasureSpec);
Activity activity = (Activity) getContext();
Rect rect = new Rect();
activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(rect);
int visibleDisplayFrameHeight = rect.top;
int screenHeight = activity.getWindowManager().getDefaultDisplay()
.getHeight();
int diff = (screenHeight - visibleDisplayFrameHeight ) - height;
if (listener != null) {
if( diff > 100 ){
listener.onSoftKeyboardShow();
} else{
listener.onSoftKeyboardHide();
}
}
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
public interface SoftKeyboardListener {
void onSoftKeyboardShow();
void onSoftKeyboardHide();
}
}
Класс SoftKeyboardDetector необязательно наследовать от FrameLayout. Вы можете использовать другие классы разметки: GridLayout, LinearLayout, RelativeLayout и т.д. Все классы разметок унаследованы от класса View, в котором определен метод onMeasure().
Как пример, для использования вышеприведенного класса необходимо Ваш View унаследовать от SoftKeyboardDetector и реализовать интерфейс SoftKeyboardDetector.SoftKeyboardListener:
public class MyView extends SoftKeyboardDetector implements SoftKeyboardDetector.SoftKeyboardListener{
public MyView(Context context) {
super(context);
setSoftKeyboardListener(this);
}
// какой-то код
@Override
public void onSoftKeyboardShow() {
// код, выполняющийся, когда клавиатура показана на экране
}
@Override
public void onSoftKeyboardHide() {
// код, выполняющийся, когда клавиатура НЕ показана на экране
}
}
В данном примере для определения наличия клавиатуры используется метод onMeasure(), который вызывается каждый раз, когда рабочий фрейм изменил свои размеры. В этом методе определяем высоту экрана с помощью следующей конструкции:
int screenHeight = activity.getWindowManager().getDefaultDisplay()
Затем вычисляем высоту рабочего фрейма:
Rect rect = new Rect();
activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(rect);
int visibleDisplayFrameHeight = rect.top;
Если разница между двумя этими величинами более 100 пикселей - вызывается метод onSoftKeyboardShow() слушателя, в противном случае - метод onSoftKeyboardHide().