问题
之前在写Window那一节的SoftInputMode的时候有提到过关于全屏模式和adjustResize的问题。平常我们开发过程中,经常会做状态栏的沉浸式,笔者一般使用沉浸式的方式是让布局全屏展示,然后单独写一个title的布局,在代码中让其设置一个状态栏高度的padding值,这样就简单的达到了状态栏沉浸式的效果。想法很美好,显示很骨感,这样做导致了一个问题,如果页面上有需要输入的东西,即使你设置softInputMode为adjustResize,也不会生效。应该是Android系统的一个bug,这里附上链接。
方案
这里先附上一个没有进行校准的效果。
我们在Activity中设置了如下代码,但是看效果图发现并没有什么卵用。1
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
既然如此,笔者想能否通过监听软键盘的弹起和落下来动态的改变LayoutParam的height值,朝着这个方向,就有了接下来的方法。
首先,我们给根布局设置一个监听事件1
2
3
4
5
6
7
8ViewGroup vp = findViewById(android.R.id.content);
vp.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener(){
public void onGlobalLayout() {
}
});
然后,我们要想办法监听到软键盘的弹起和落下,这里笔者通过布局可视高度的变化来进行判断。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20Rect rect = new Rect();
int visibleHeight = 0;
public void onGlobalLayout() {
vp.getWindowVisibleDisplayFrame(rect);
if (visibleHeight == 0) {
visibleHeight = rect.bottom;
} else if (visibleHeight - rect.bottom > 200) {
// 这里键盘弹起来
visibleHeight = rect.bottom;
lp.height = visibleHeight;
vp.requestLayout();
} else if (rect.bottom - visibleHeight > 200) {
// 这里键盘落下去
visibleHeight = rect.bottom;
lp.height = visibleHeight;
vp.requestLayout();
}
}
最后运行下来看看效果图。