监听软键盘 弹起 关闭

来源:互联网 发布:.手机域名有多少人注册 编辑:程序博客网 时间:2024/05/16 08:01

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

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

我这里 提供了 两种方法  不过都大同小异    不过一个是集成了  ViewGroup  一个是直接在根布局添加监听    根据个人爱好吧

1.首先获取 该页面的根布局 rootView;  接着添加页面变化监听

添加监听之后 我们接着计算 页面变化的高度  来判断 是弹起 还是 关闭

rootView.addOnLayoutChangeListener(this);

@Overridepublic 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监听肯定不陌生  当然 这种情况也可以不继承一个类  直接 获取根布局 然后 直接添加这个监听 都可以 根据个人喜好了

原创粉丝点击