上一篇提出了一种软键盘弹出时输入框显示在键盘上的方式,就是设置活动关于软键盘的属性为adjustPan,让软键盘把输入框顶上去。但是这种体验并不是很好,因为输入框上面的内容也都一起被顶了上去。
所以有另一种思路,就是软键盘弹出时输入框布局移动到软键盘上方,这里的移动是通过设置marginBottom实现的。
首先要做到的就是监听软键盘的弹出与回收,这个是通过给活动添加布局改变的监听实现的(在上一篇提到过):
final View view=getWindow().getDecorView();
view.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
Rect rect=new Rect();
view.getWindowVisibleDisplayFrame(rect);
int displayHeight=rect.bottom-rect.top;
int maxHeight=view.getHeight();
int height=maxHeight-displayHeight;
if (height<200){
min=height;
}
if (height!=lastHeight){
LinearLayout.LayoutParams params= (LinearLayout.LayoutParams) llEdit.getLayoutParams();
params.setMargins(0,0,0,height-min);
llEdit.setLayoutParams(params);
lastHeight=height;
}
}
});
变量height表示界面被挤压掉的高度,软键盘弹出时可以近似认为是软键盘的高度。但是经过测试就算没有软键盘这个差值height也不是0(这里用min表示),所以设置min来辅助测算marginBottom。
每当软键盘弹出和收回的时候,这个监听方法得到调用,然后用height-min作为输入框布局的marginBottom,就可以做到布局出现在软键盘正上方,并在软键盘收回后沉底。