1、问题
最近公司需要独立开发一个IM聊天应用,UI全定制,接着就发生了键盘和表情栏切换时的一些不愉快。
从左往右看图,在键盘已弹出的情况下点击打开功能栏(左图),此时键盘应该是立刻被关闭而功能栏应该被打开,但是却同时出现了键盘和表情栏/功能栏,功能栏被顶起了(中图)。在功能栏出现大约0.1秒后键盘才收起,变成(右图)的样子。
注:我保证,在打开表情栏/功能栏的同时我已经调用了
hideSoftKeyboard()
来关闭键盘了。
2、初步分析
键盘的开关是异步的,给相关的事件添加延时开关可以解决这个问题。例如handler.postDelay()
然而,在不同的机型上结果不一样,且分有无开启系统动画的情况。所以这个方法不可靠
3、参考
我百度了下,又github、掘金了下,找到了几篇可行的文章和例子。首先感谢下下方链接作者的的例子
https://github.com/leavesC/Keyboard 。直接上源码
这个作者使用的是
postDelay()
。这个跟我的初步分析是符合的,键盘的开关是异步的且时间不确定的。
4、解决办法
既然写死postDelayed
的延迟时间不可靠,那么,我们可以监听键盘打开/关闭以后再进行显示/隐藏表情栏或功能栏。
5、总结
推荐大家先运行下上方链接的源码理解后再进行修改,因为键盘和表情/功能栏切换还涉及到布局高度锁定的操作。