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

Напишіть перше повідомлення!

Ви повинні увійти під своїм аккаунтом щоб залишати коментарі