全屏模式和adjustResize的冲突

问题

  之前在写Window那一节的SoftInputMode的时候有提到过关于全屏模式和adjustResize的问题。平常我们开发过程中,经常会做状态栏的沉浸式,笔者一般使用沉浸式的方式是让布局全屏展示,然后单独写一个title的布局,在代码中让其设置一个状态栏高度的padding值,这样就简单的达到了状态栏沉浸式的效果。想法很美好,显示很骨感,这样做导致了一个问题,如果页面上有需要输入的东西,即使你设置softInputMode为adjustResize,也不会生效。应该是Android系统的一个bug,这里附上链接

方案

  这里先附上一个没有进行校准的效果。
  001
  我们在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
8
ViewGroup vp = findViewById(android.R.id.content);
vp.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener(){

@Override
public void onGlobalLayout() {

}
});

  然后,我们要想办法监听到软键盘的弹起和落下,这里笔者通过布局可视高度的变化来进行判断。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Rect rect = new Rect();
int visibleHeight = 0;

@Override
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();
}
}

  最后运行下来看看效果图。
  002

本文标题:全屏模式和adjustResize的冲突

文章作者:严方雄

发布时间:2018-11-16

最后更新:2018-11-17

原始链接:http://yanfangxiong.com/2018/11/16/全屏模式和adjustResize的冲突/

0%