Android全屏状态下弹出输入法adjustResize无效的修复方案及踩坑指南
输入框被输入法遮挡的问题相信很多人都遇见过,这次记录的是Activity在全屏FullScreen状态下windowSoftInputMode的adjustResize不生效问题。
下面是WindowManager类关于SOFT_INPUT_ADJUST_RESIZE的官方注释,在FullScreen状态下adjustResize flag会被忽略。
/** Adjustment option for {@link #softInputMode}: set to allow the
* window to be resized when an input
* method is shown, so that its contents are not covered by the input
* method. This can <em>not</em> be combined with
* {@link #SOFT_INPUT_ADJUST_PAN}; if
* neither of these are set, then the system will try to pick one or
* the other depending on the contents of the window. If the window's
* layout parameter flags include {@link #FLAG_FULLSCREEN}, this
* value for {@link #softInputMode} will be ignored; the window will
* not resize, but will stay fullscreen.
*/
public static final int SOFT_INPUT_ADJUST_RESIZE = 0x10;
直接Google搜索FullScreen AdjustResize失效的相关资料,可以看到很多相关资料都指向Google的bug issue 5497,并且有现成的解决方案,大概有3种:
- 在输入法弹出的时候改变rootView或decorView的高度,使view的高度 = 屏幕高度 - 输入法高度
- 在输入法弹出的时候改变rootView的底部padding边距(当输入框置于view的底部时),padding值跟输入法高度相等
- 在输入法弹出的时候使rootView垂直向上平移,平移高度跟输入法高度相等
以上3种方案选择哪一种需要看具体需求,如果需求需要View完整显示出来而且可以压缩显示时,选择1、2方案,否则选择方案3。
鸡汁的我,直接选择方案1,并且使用网上各路大神发出来的现成工具类AndroidBug5497Workaround,运行一遍,完美,直接把测试报过来的BUG关闭掉,文章到此结束。
。
。
。
太天真了,小米2S出问题,小米MIX3出问题,三星S8出问题,而且表现各不相同。。
三种机型出现的问题的表现
-
小米2S:弹出输入法时,如下图所示,内容区域高度缩小正常,但内容延伸到了屏幕外围,输入法与输入框之间出现一大段空白间距,间距基本上等于输入法的高度。
-
小米MIX3:弹出输入法时,如下图所示,内容区域高度缩小失败,部分内容延伸到屏幕外围,输入框部分区域被输入法遮盖,输入框光标刚好展示完,基本上跟AdjustPan的效果一致。
-
三星S8:输入法缩小收起时,输入框监听界面布局变化回调失效,输入框没有相应进行隐藏操作,并出现部分输入框显示在页面底端,部分延伸到屏幕外。
兼容性事故现场分析:
此处通过AS的布局分析神器Layout Inspector大量分析,得出以下结论,分析过程本篇略过。
-
小米2S的表现在部分5.0或以下机器中会出现,通过分析得到在输入法弹出后decorView有一个纵向向上的偏移,偏移距离大致等于输入法高度,这个偏移其实就是AdjustPan的逻辑。再查看rootView的高度,发现高度是我们设进去的 (屏幕总高度 - 输入法高度)。所以中间空白区域的出现原因就是系统在AdjustPan之后我们又再次设定了rootView高度,而rootView是默认布局在顶部的 (top to top of parent),导致rootView大部分内容显示在屏幕外,下方则是空白的decorView。
-
小米MIX3的表现,基本上就是标准的AdjustPan了,我们自己设定的高度失效,在页面弹出输入法的时候可以看到rootView有一瞬间的闪烁,看上去效果就像内容