今天测试提了个BUG,感觉挺典型,做一下记录
问题是 在输入框在布局靠下面的时候,当弹出软键盘会把布局整体上移,导致标题没有了,键盘离的输入框特别近(虽然没有遮挡字),测试让优化一下。
百度一半天,
1. 发现添加 Android:windowSoftInputMode 属性各种添加 和滚动控件配合,出现的结果要不不能移动,要不整体移动,远远达不到想要的效果。
2. 最后想通过监听跟布局的变化,来获取布局在窗体的不可视区域大小,监听键盘弹出,从而当键盘弹出时,计算出根布局要向上滚动的高度(要点:获取指定控件的坐标,计算出要滚动的高度 ,这样 可以让布局滚到指定位置了)
代码为:
private void beyondKeyboardLayout(final View root, final View view) {
// 监听根布局的视图变化
root.getViewTreeObserver().addOnGlobalLayoutListener(
new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
Rect rect = new Rect();
// 获取内容布局在窗体的可视区域
root.getWindowVisibleDisplayFrame(rect);
// 获取内容布局在窗体的不可视区域高度(被其他View遮挡的区域高度)
int rootInvisibleHeight = root.getHeight() - rect.bottom;
if (rootInvisibleHeight > 120) {
int[] location = new int[2];
view.getLocationInWindow(location);
//解决大屏幕会下移问题
if((location[1]+ view.getHeight())> rect.bottom){
int buttonHeight = (location[1]
+ view.getHeight()) - rect.bottom;
root.scrollTo(0, buttonHeight);
}else {
root.scrollTo(0, 0);
}
} else {
// 键盘隐藏
root.scrollTo(0, 0);
}
}
});
}
注意:根布局必须为整个屏幕布局,当时我再写的时候开始布局为线性布局嵌套标题和滑动布局,结果发现把滑动布局当根部局无法实现滑动,改为相对布局标题放在下面,内容布局把标题的位置用控件充气来(任务栏高度动态获取,否则特定机型不好看)让整体内容布局为根布局,实现上述效果。
仅做记录为以后自己在遇到类似问题方便看
参考连接https://blog.csdn.net/crazyzhangxl/article/details/80857791