Android監(jiān)聽軟鍵盤彈出并獲取軟鍵盤高度

前言

我們都知道在 Android 上軟鍵盤彈出會使我們的窗口高度被壓縮,這時我們可能就要通知界面做出調(diào)整以適應(yīng)新的高度。
網(wǎng)上有很多監(jiān)聽軟鍵盤彈出的方法,但大多用法過于復(fù)雜或存在缺陷,因此今天我們來聊聊如何簡單的監(jiān)聽軟鍵盤彈出并獲取軟鍵盤高度。

思路

上面已經(jīng)提到了,軟鍵盤彈出后 APP 窗口的高度會發(fā)生改變,而高度改變必然會導(dǎo)致 View 的 onSizeChanged 方法被調(diào)用,因此我們可以從這里下手。
我們可以自定義一個 View 繼承自 FrameLayout,作為我們要監(jiān)聽軟鍵盤彈出的界面的容器,然后復(fù)寫 onSizeChanged 方法。根據(jù)新舊高度來判斷鍵盤是否彈出。
這里還有一個問題,并不是只有軟鍵盤彈出或隱藏會引起窗口高度改變,在一些支持隱藏導(dǎo)航欄(虛擬按鍵)的手機(jī)(比如很多華為手機(jī))上,隱藏或彈出導(dǎo)航欄同樣會引起窗口高度改變,我們也要加以判斷。
由于沒有能夠百分百準(zhǔn)確獲取導(dǎo)航欄高度的辦法,因此我們認(rèn)為鍵盤最小高度為屏幕高度的1/4,小于這個高度的就不認(rèn)為是鍵盤彈出或隱藏。

實(shí)現(xiàn)

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();
        // 認(rèn)為鍵盤最小高度為屏幕的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 作為需要監(jiān)聽軟鍵盤彈出隱藏的界面的容器,然后對該 View 添加監(jiān)聽器即可。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,523評論 25 708
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,252評論 4 61
  • 2017年6月25日 天氣晴 星期天 我今天下午去一樓玩滑板,滑著滑著我就會滑了,我滑了一會兒突然摔倒了,但...
    琦琦花仙子小月閱讀 176評論 0 1
  • 周五快下班的時候了,心情不知道為什么有些雜亂。 頭有點(diǎn)暈,眼睛酸澀,可能因?yàn)橹形绯灾埧础度嗣竦拿x》沒有睡覺的緣...
    真冉閱讀 357評論 0 1
  • 俗話說,有水的地方最先發(fā)展,英國當(dāng)年發(fā)展也是靠海運(yùn)。而中國更是靠京杭大運(yùn)河等完成了自己的水利全運(yùn)輸。。但是到了夏天...
    小編在飛閱讀 197評論 0 1