最近在公司要做一个独立的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();
}