完美解决安卓上层输入控件随键盘弹起,下层 UI 变形问题
原文链接 http://blog.piasy.com/2016/02/24/Android-Multiple-Fragment-Layer/
注:以下为加速网络访问所做的原文缓存,经过重新格式化,可能存在格式方面的问题,或偶有遗漏信息,请以原文为准。
在YOLO的直播间内,可以发送文字评论,要求文字输入框随键盘弹起,而底下的视频又不会变形,也不会被顶上去,这个问题曾一度困扰我们很久,适逢大师兄公司安卓工程师也遇到了同样的问题,所以简单整理成一篇文章,供更多开发者参考。本文源码地址。
面临的问题
主要还是activity的windowSoftInputMode
选项只能设置一种值,如果希望输入框随着键盘弹起而顶上去,那底下的视图要么会顶上去,要么会变形(adjustResize
),而希望底下的视图保持不动就成了一个伤脑筋的问题。
有图有真相
解决思路
目前想到了三种思路:
1, 使用多层activity,底下用于播放视频,顶上用于其他交互信息以及文字输入框,顶上的activity设置背景透明,由于是两个单独的activity,它们响应键盘弹起的行为就可以独立开来了,但是两层activity的开销较大,所以并未采用过;
2, 一层activity,用于播放视频,其他交互信息以及文字输入框作为一个dialog fragment,由于dialog fragment响应键盘弹起的行为不受activity限制,所以同样可以达到想要的效果,YOLO曾一度使用过该方法,但是由于dialog fragment终究是一个dialog,它显示在窗口的最顶层,会带来其他UI层次的问题,最终废弃了这种方法;
3, 法2的改进版本,一层activity,但是使用多层fragment,最底层fragment播放视频,上层fragment放其他元素,而文字输入框单独放到一个dialog fragment里面,由于文字输入并非常态,它所在的dialog并不会长时间显示,所以不会带来负面效果,而activity的windowSoftInputMode
值则设置为adjustPan
,目前看来最完美了;