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

前言

我们都知道在 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 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,482评论 25 708
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,251评论 4 61
  • 2017年6月25日 天气晴 星期天 我今天下午去一楼玩滑板,滑着滑着我就会滑了,我滑了一会儿突然摔倒了,但...
    琦琦花仙子小月阅读 176评论 0 1
  • 周五快下班的时候了,心情不知道为什么有些杂乱。 头有点晕,眼睛酸涩,可能因为中午吃着饭看《人民的名义》没有睡觉的缘...
    真冉阅读 357评论 0 1
  • 俗话说,有水的地方最先发展,英国当年发展也是靠海运。而中国更是靠京杭大运河等完成了自己的水利全运输。。但是到了夏天...
    小编在飞阅读 197评论 0 1