监听软键盘 弹起 关闭

在开发过程中 我们经常会遇到这种情况  监听软键盘的 弹起 或者关闭事件  但是安卓并没有直接提供这个监听  需要我们自己做处理   我们唯一做的就是 监听  页面高度的变化

通过页面高度的变化 知道了   软键盘的弹起 或者  关闭

我这里 提供了 两种方法  不过都大同小异    不过一个是集成了  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监听肯定不陌生  当然 这种情况也可以不继承一个类  直接 获取根布局 然后 直接添加这个监听 都可以 根据个人喜好了

发布了27 篇原创文章 · 获赞 12 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/u013297345/article/details/74908961