在开发过程中 我们经常会遇到这种情况 监听软键盘的 弹起 或者关闭事件 但是安卓并没有直接提供这个监听 需要我们自己做处理 我们唯一做的就是 监听 页面高度的变化
通过页面高度的变化 知道了 软键盘的弹起 或者 关闭
我这里 提供了 两种方法 不过都大同小异 不过一个是集成了 ViewGroup 一个是直接在根布局添加监听 根据个人爱好吧
1.首先获取 该页面的根布局 rootView; 接着添加页面变化监听
添加监听之后 我们接着计算 页面变化的高度 来判断 是弹起 还是 关闭
rootView.addOnLayoutChangeListener(this);
@Override public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int olRight, int oldBottom) { if(oldBottom != 0 && bottom != 0 &&(oldBottom - bottom > keyHeight)){ //软键盘弹起 bottomView.setVisibility(View.GONE); mainTab.setVisibility(View.GONE); }else if(oldBottom != 0 && bottom != 0 &&(bottom - oldBottom > keyHeight)){ //软键盘关闭 bottomView.setVisibility(View.VISIBLE); mainTab.setVisibility(View.VISIBLE); } }
这个 keyheight 我这边为 手机屏幕高度的三分之一
2.第二种 就是 继承 RelativeLayout
public class SoftKeyboardSizeWatchLayout extends RelativeLayout { private Context mContext; private int mOldh = -1; private int mNowh = -1; protected int mScreenHeight = 0; protected boolean mIsSoftKeyboardPop = false; public SoftKeyboardSizeWatchLayout(Context context, AttributeSet attrs) { super(context, attrs); this.mContext = context; getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { Rect r = new Rect(); ((Activity) mContext).getWindow().getDecorView().getWindowVisibleDisplayFrame(r); if (mScreenHeight == 0) { mScreenHeight = r.bottom; } mNowh = mScreenHeight - r.bottom; if (mOldh != -1 && mNowh != mOldh) { if (mNowh > 0) { mIsSoftKeyboardPop = true; if (mListenerList != null) { for (OnResizeListener l : mListenerList) { l.OnSoftPop(mNowh); } } } else { mIsSoftKeyboardPop = false; if (mListenerList != null) { for (OnResizeListener l : mListenerList) { l.OnSoftClose(); } } } } mOldh = mNowh; } }); } public boolean isSoftKeyboardPop() { return mIsSoftKeyboardPop; } private List<OnResizeListener> mListenerList; public void addOnResizeListener(OnResizeListener l) { if (mListenerList == null) { mListenerList = new ArrayList<>(); } mListenerList.add(l); } public interface OnResizeListener { /** * 软键盘弹起 */ void OnSoftPop(int height); /** * 软键盘关闭 */ void OnSoftClose(); } }
这个类中 可以看到 也是添加了 一个监听
addOnGlobalLayoutListener 在这个监听中做一些高度变化的处理 如果经常遇到要监听页面测量完毕 获取控件正确的宽高这种情况 对这个addOnGlobalLayoutListener监听肯定不陌生 当然 这种情况也可以不继承一个类 直接 获取根布局 然后 直接添加这个监听 都可以 根据个人喜好了