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