终于有时间继续写博客了,上一篇博客中提到的使用「adjustPan」模式来实现表情输入键盘的思路,在这一段时间的使用过程中出现了很多兼容性问题,各种机型(有无虚拟按键)、系统版本(高度返回值是否包含状态栏)返回的软键盘高度与实际的软键盘高度不同,监听的调用方式也不尽相同,最后导致界面出现错位。起始回头仔细想想,让软键盘覆盖表情键盘这种办法从代码角度看确实很傻。。。不够优雅。
研究了一段时间、翻看了一些开源项目的实现原理,特别是著名的「四次元」,给了我很大启发,我重写了一遍依赖库,给北邮人论坛客户端更新后,再没有人反馈表情键盘有问题了,下面简单谈谈实现的思路。
SoftInputMode 模式
首先,Android系统在界面上弹出软键盘时会将整个Activity的高度压缩,即默认的SoftInputMode是「AdjustResize」,直觉上表情键盘的高度应该设置得和软键盘相同,显示表情键盘时的同时将软键盘收起。这种思路比较直观,比「AdjustPan」模式好的地方在于表情键盘只有两种状态(Visible/Gone),而不是三种(Visible/Invisible/Gone),处理起来逻辑上会更简单。
表情键盘的高度
如果按照上面的思路直接写,应该是这样:
emotionButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mEmotionLayout.isShown()) {
hideEmotionLayout();
} else {
showEmotionLayout();
}
}
});
代码很简单,几乎没有别的逻辑判断,同样的,我们在显示表情键盘之前,需要判断一下软键盘的高度,将其设置给表情键盘: