【Android TimeCat】 切换软键盘和标签键盘时界面跳动

背景

在信息操作页面,点击标签打开对应的选择面板时,输入界面会上下跳动一下。分析一下原因,点击标签按钮后,先收起了软键盘,当前Activity的高度变高,输入框回到了界面底部;再打开选择面板时,输入框又被顶上来,所有看起来点击标签按钮后输入框会上下跳动一下。无论是先隐藏软键盘还是先打开选择面板都会有这个问题

解决

如果这时候去纠结隐藏软键盘和打开面板如何同步的话就会走进一个牛角尖,去处理不同机型之间的兼容性问题了。其实解决思路非常简单,输入框不是会上下跳么,那固定它的位置不就好了?

举个例子,如果整个界面的根布局是LinearLayout,那么一个控件的位置其实是由它上面所有控件的高度决定的,如果它上面所有控件的高度都不变化,那即使整个Activity的高度变化(开/关软键盘)也不会影响这个控件的位置,也就不会发生跳动了。

但是我们发现,即使锁定了我们的信息操作页面根布局的高度,切换时还是有小幅度跳动。经过细致的分析冷静思考,我们终于找到了答案。由于我们的信息操作页面是用Activity通过设置弹框样式android:theme="@style/EditDialogStyle"来实现的,而弹框样式是悬浮着的,会自动调整页面位置,软键盘显示时即使根布局的高度锁定,整个视图仍然会小幅度上移。所以我们的完美解决方案是同时锁定根布局高度和页面位置。

具体实现我们已经封装在SmartKeyboardManager类中,自动处理锁定高度和锁定页面位置的问题,顺便封装了addKeyboard方法来绑定按钮和相应的面板,并且使用了建造者设计模式。使用时如下调用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/**
* 设置软键盘和选择面板的平滑交互
*/
private void setKeyboardManager() {
mSmartKeyboardManager = new SmartKeyboardManager.Builder(this)
.setContentView(ll_content_view)
.setEditText(et_content)
.addKeyboard(btn_label, select_label)
.addKeyboard(btn_date, select_date)
.addKeyboard(btn_time, select_time)
.addKeyboard(btn_remind, select_remind)
.addKeyboard(btn_tag, select_tag)
.create();
}

SmartKeyboardManager

当前网速较慢或者你使用的浏览器不支持博客特定功能,请尝试刷新或换用Chrome、Firefox等现代浏览器