最近在公司要做一個獨立的app (不是main app)。但是遇到一個問題,每次鍵盤彈起的時候,整個view就變小了。這是可以理解的,因為我在manifest文件中設置的windowSoftInputMode="adjustResize"。這是我理解的resize。但是我注意到main app中是沒有resize,我也要實現相同的效果。
我看了下main app的manifest文件,發現softInputMode同樣也是adjustResize。這時我猜肯定是有人做了什么手腳。可能是寫了custom view,讓view不會resize。但是看了半天layout文件,愣是沒找到這樣的一個custom view。那么可能是改了某個window的flag。但是在code里翻了半天,沒發現哪個flag會影響這個。google了半天,大家都是問為什么adjustResize不好使。
最后只能google中文試一試,果真讓我找到了。原來android在加了SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN這個flag之后,adjustResize就會失效。所以通過加這個flag就可以實現鍵盤彈起但是屏幕不變的效果。
同時記一下如何在全屏的adjustResize的情況下檢測鍵盤的狀態。主要思路就是利用全屏view的高度與當前可視的高度(沒被鍵盤遮擋)的差值,如果差值大于一個閾值,就認為keyboard是顯示的,否則是不顯示的。
這種方法在全的adjustResize的條件下也是有效的。
@Override
public void onGlobalLayout() {
// Detect the actual display area of the fragment. mFragmentLayout is view we use in Fragment.onCreateView.
mFragmentLayout.getWindowVisibleDisplayFrame(mRect);
// rect.top is set to status bar height when it is included in #getWindowVisibleDisplayFrame, and 0 otherwise.
int systemUiPadding = mRect.top;
int obstructedHeight = mFragmentLayout.getHeight() - mRect.height();
int keyboardHeight = obstructedHeight - systemUiPadding;
// Use height to determine if keyboard is showing.
boolean isKeyboardShowing = keyboardHeight > getKeyboardHeightThreshold();
}