Android. Как определить, отображается клавиатура на экране или нет

февраля
23
2012
Метки: android softkeyboard

В 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().

Напишите первое сообщение!

Вы должны войти под своим аккаунтом чтобы оставлять комментарии