android 獲取鍵盤高度和鍵盤是否彈出

轉(zhuǎn)自 http://www.itdecent.cn/p/4c7703361835

原理

軟鍵盤彈出時(shí),布局會(huì)進(jìn)行調(diào)整,這時(shí)只要我們監(jiān)聽(tīng)到跟布局的高度和可是區(qū)域的高度后,他們的差值就是軟件盤的高度。要獲取我們需要的條件要依靠這兩位哥們ViewTreeObserver.OnGlobalLayoutListener和getWindowVisibleDisplayFrame(rect)

  • OnGlobalLayoutListener 是ViewTreeObserver的內(nèi)部類,當(dāng)一個(gè)視圖樹(shù)的布局發(fā)生改變時(shí),可以被ViewTreeObserver監(jiān)聽(tīng)到,這是一個(gè)注冊(cè)監(jiān)聽(tīng)視圖樹(shù)的觀察者(observer),在視圖樹(shù)的全局事件改變時(shí)得到通知。我們通過(guò)OnGlobalLayoutListener監(jiān)聽(tīng)布局變化通知,這樣我們就可以間接的監(jiān)聽(tīng)到軟鍵盤的動(dòng)態(tài)。

  • getWindowVisibleDisplayFrame(rect)可以獲取到程序顯示的區(qū)域,包括標(biāo)題欄,但不包括狀態(tài)欄,獲取后的區(qū)域坐標(biāo)會(huì)保存在rect(Rect類型)中。

  • 軟鍵盤的高度
    height=rootView.getRootView().getHeight()-rect.bottom;
    rootView是xml的根布局

  • Activity的android:windowSoftInputMode="adjustNothing",這種模式會(huì)失效,其他模式都可,推薦使用adjustResize。

福利區(qū)

private static boolean isFirst = true;

public interface OnGetSoftHeightListener {
    void onShowed(int height);
}
public interface OnSoftKeyWordShowListener {
    void hasShow(boolean isShow);
}

/** * 獲取軟鍵盤的高度 * *
 @param rootView *
 @param listener
 */
public static void getSoftKeyboardHeight(final View rootView, final OnGetSoftHeightListener listener) {
    final ViewTreeObserver.OnGlobalLayoutListener layoutListener
            = new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            if (isFirst) {
                final Rect rect = new Rect();
                rootView.getWindowVisibleDisplayFrame(rect);
                final int screenHeight = rootView.getRootView().getHeight();
                final int heightDifference = screenHeight - rect.bottom;
//設(shè)置一個(gè)閥值來(lái)判斷軟鍵盤是否彈出
                boolean visible = heightDifference > screenHeight / 3;
                if (visible) {
                    isFirst = false;
                    if (listener != null) {
                        listener.onShowed(heightDifference);
                    }
                    rootView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
                }
            }
        }
    };
    rootView.getViewTreeObserver().addOnGlobalLayoutListener(layoutListener);
}



/** * 判斷軟鍵盤是否彈出
 * * @param rootView
 * @param listener
 *備注:在不用的時(shí)候記得移除OnGlobalLayoutListener
 */
public ViewTreeObserver.OnGlobalLayoutListener doMonitorSoftKeyWord(final View rootView, final OnSoftKeyWordShowListener listener) {
    final ViewTreeObserver.OnGlobalLayoutListener layoutListener = new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            final Rect rect = new Rect();
            rootView.getWindowVisibleDisplayFrame(rect);
            final int screenHeight = rootView.getRootView().getHeight();
            LogUtil.e("TAG",rect.bottom+"#"+screenHeight);
            final int heightDifference = screenHeight - rect.bottom;
            boolean visible = heightDifference > screenHeight / 3;
            if (listener != null)
                listener.hasShow(visible);
        }
    };
    rootView.getViewTreeObserver().addOnGlobalLayoutListener(layoutListener);
    return layoutListener;
}

@Override
protected void onDestroy() {
    super.onDestroy();
//這里對(duì)監(jiān)聽(tīng)器進(jìn)行移除
    if (softkeyListener != null){
     findViewById(R.id.rl_main).getViewTreeObserver().removeOnGlobalLayoutListener(softkeyListener);
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容