由于安卓系统并没有提供软键盘弹入和弹出的系统方法,所以我们有时候需要用到监听软件盘的时候会非常的麻烦,今天我根据监听视图树中全局布局发生改变或者视图树中的某个视图的可视状态发生改变超过一定的数值来监听软键盘的弹入弹出事件,使用起来也非常简单.
import android.app.Activity; import android.graphics.Rect; import android.view.View; import android.view.ViewTreeObserver; public class SoftKeyBoardListener { private View rootView; // activity的根视图 private int rootViewVisibleHeight; // 记录根视图的显示高度 private OnSoftKeyBoardChangeListener onSoftKeyBoardChangeListener; private SoftKeyBoardListener(Activity activity) { // 获取activity的根视图 rootView = activity.getWindow().getDecorView(); // 监听视图树中全局布局发生改变或者视图树中的某个视图的可视状态发生改变 rootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { // 获取当前根视图在屏幕上显示的大小 Rect r = new Rect(); rootView.getWindowVisibleDisplayFrame(r); int visibleHeight = r.height(); if (rootViewVisibleHeight == 0) { rootViewVisibleHeight = visibleHeight; return; } // 根视图显示高度没有变化,可以看作软键盘显示/隐藏状态没有改变 if (rootViewVisibleHeight == visibleHeight) { return; } // 根视图显示高度变小超过300,可以看作软键盘显示了,该数值可根据需要自行调整 if (rootViewVisibleHeight - visibleHeight > 300) { if (onSoftKeyBoardChangeListener != null) { onSoftKeyBoardChangeListener.keyBoardShow(rootViewVisibleHeight - visibleHeight); } rootViewVisibleHeight = visibleHeight; return; } // 根视图显示高度变大超过300,可以看作软键盘隐藏了,该数值可根据需要自行调整 if (visibleHeight - rootViewVisibleHeight > 300) { if (onSoftKeyBoardChangeListener != null) { onSoftKeyBoardChangeListener.keyBoardHide(visibleHeight - rootViewVisibleHeight); } rootViewVisibleHeight = visibleHeight; } } }); } private void setOnSoftKeyBoardChangeListener(OnSoftKeyBoardChangeListener onSoftKeyBoardChangeListener) { this.onSoftKeyBoardChangeListener = onSoftKeyBoardChangeListener; } public interface OnSoftKeyBoardChangeListener { void keyBoardShow(int height); void keyBoardHide(int height); } public static void setListener(Activity activity, OnSoftKeyBoardChangeListener onSoftKeyBoardChangeListener) { SoftKeyBoardListener softKeyBoardListener = new SoftKeyBoardListener(activity); softKeyBoardListener.setOnSoftKeyBoardChangeListener(onSoftKeyBoardChangeListener); } }