Android全屏状态下弹出输入法adjustResize无效的修复方案及踩坑指南

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种:

  1. 在输入法弹出的时候改变rootView或decorView的高度,使view的高度 = 屏幕高度 - 输入法高度
  2. 在输入法弹出的时候改变rootView的底部padding边距(当输入框置于view的底部时),padding值跟输入法高度相等
  3. 在输入法弹出的时候使rootView垂直向上平移,平移高度跟输入法高度相等

以上3种方案选择哪一种需要看具体需求,如果需求需要View完整显示出来而且可以压缩显示时,选择1、2方案,否则选择方案3。

鸡汁的我,直接选择方案1,并且使用网上各路大神发出来的现成工具类AndroidBug5497Workaround,运行一遍,完美,直接把测试报过来的BUG关闭掉,文章到此结束。



太天真了,小米2S出问题,小米MIX3出问题,三星S8出问题,而且表现各不相同。。
流下了没技术的泪水


三种机型出现的问题的表现
  1. 小米2S:弹出输入法时,如下图所示,内容区域高度缩小正常,但内容延伸到了屏幕外围,输入法与输入框之间出现一大段空白间距,间距基本上等于输入法的高度。
    mi2s

  2. 小米MIX3:弹出输入法时,如下图所示,内容区域高度缩小失败,部分内容延伸到屏幕外围,输入框部分区域被输入法遮盖,输入框光标刚好展示完,基本上跟AdjustPan的效果一致。
    mix3

  3. 三星S8:输入法缩小收起时,输入框监听界面布局变化回调失效,输入框没有相应进行隐藏操作,并出现部分输入框显示在页面底端,部分延伸到屏幕外。
    s8


兼容性事故现场分析:

此处通过AS的布局分析神器Layout Inspector大量分析,得出以下结论,分析过程本篇略过。

  1. 小米2S的表现在部分5.0或以下机器中会出现,通过分析得到在输入法弹出后decorView有一个纵向向上的偏移,偏移距离大致等于输入法高度,这个偏移其实就是AdjustPan的逻辑。再查看rootView的高度,发现高度是我们设进去的 (屏幕总高度 - 输入法高度)。所以中间空白区域的出现原因就是系统在AdjustPan之后我们又再次设定了rootView高度,而rootView是默认布局在顶部的 (top to top of parent),导致rootView大部分内容显示在屏幕外,下方则是空白的decorView。

  2. 小米MIX3的表现,基本上就是标准的AdjustPan了,我们自己设定的高度失效,在页面弹出输入法的时候可以看到rootView有一瞬间的闪烁,看上去效果就像内容

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值