原理
軟鍵盤彈出時(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 static 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();
Log.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;
}