美文网首页自定义控件
Android监听软键盘弹出并获取软键盘高度

Android监听软键盘弹出并获取软键盘高度

作者: 王晨彦 | 来源:发表于2016-09-14 13:22 被阅读1437次

    前言

    我们都知道在 Android 上软键盘弹出会使我们的窗口高度被压缩,这时我们可能就要通知界面做出调整以适应新的高度。
    网上有很多监听软键盘弹出的方法,但大多用法过于复杂或存在缺陷,因此今天我们来聊聊如何简单的监听软键盘弹出并获取软键盘高度。

    思路

    上面已经提到了,软键盘弹出后 APP 窗口的高度会发生改变,而高度改变必然会导致 View 的 onSizeChanged 方法被调用,因此我们可以从这里下手。
    我们可以自定义一个 View 继承自 FrameLayout,作为我们要监听软键盘弹出的界面的容器,然后复写 onSizeChanged 方法。根据新旧高度来判断键盘是否弹出。
    这里还有一个问题,并不是只有软键盘弹出或隐藏会引起窗口高度改变,在一些支持隐藏导航栏(虚拟按键)的手机(比如很多华为手机)上,隐藏或弹出导航栏同样会引起窗口高度改变,我们也要加以判断。
    由于没有能够百分百准确获取导航栏高度的办法,因此我们认为键盘最小高度为屏幕高度的1/4,小于这个高度的就不认为是键盘弹出或隐藏。

    实现

    public class ResizeFrameLayout extends FrameLayout {
        private KeyboardListener mListener;
        private int minKeyboardHeight;
    
        public interface KeyboardListener {
            void onKeyboardShown(int height);
    
            void onKeyboardHidden(int height);
        }
    
        public ResizeFrameLayout(Context context) {
            super(context);
        }
    
        public ResizeFrameLayout(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        public ResizeFrameLayout(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
        }
    
        public void setKeyboardListener(KeyboardListener listener) {
            mListener = listener;
        }
    
        @Override
        protected void onAttachedToWindow() {
            super.onAttachedToWindow();
            // 认为键盘最小高度为屏幕的1/4
            DisplayMetrics dm = getResources().getDisplayMetrics();
            minKeyboardHeight = dm.heightPixels / 4;
        }
    
        @Override
        protected void onSizeChanged(int w, int h, int oldw, int oldh) {
            super.onSizeChanged(w, h, oldw, oldh);
            if (h == 0 || oldh == 0) {
                return;
            }
            if (oldh - h > minKeyboardHeight) {
                notifyKeyboardEvent(true, oldh - h);
            } else if (h - oldh > minKeyboardHeight) {
                notifyKeyboardEvent(false, h - oldh);
            }
        }
    
        private void notifyKeyboardEvent(boolean show, int keyboardHeight) {
            if (mListener == null) {
                return;
            }
            if (show) {
                mListener.onKeyboardShown(keyboardHeight);
            } else {
                mListener.onKeyboardHidden(keyboardHeight);
            }
        }
    }
    

    使用

    将该 View 作为需要监听软键盘弹出隐藏的界面的容器,然后对该 View 添加监听器即可。

    相关文章

      网友评论

      本文标题:Android监听软键盘弹出并获取软键盘高度

      本文链接:https://www.haomeiwen.com/subject/qxuvettx.html