之前在解决键盘弹出会吧背景顶上去的问题的时候遇到了很多坑,在网上找到的demo很多但效果都不是很理想。后来发现一种方法可以完美解决这种问题;所以这里记录一下,希望对其他人有帮助。该方法可完美随意控制一些视图是否上移或不上移;
实现方法主要是通过监听视图变化来动态改变一些view的高度,具体实现方法如下:
首先需要设置承载的Activity的 android:windowSoftInputMode="adjustPan",必须要设置为adjustPan模式;其他各种交互模式可请自行查看相关文档;
设置根布局监听,在当窗体发生变化的时候做一些处理,代码如下
rootView.getViewTreeObserver().addOnGlobalLayoutListener(
newViewTreeObserver.OnGlobalLayoutListener() {
@Override
public voidonGlobalLayout() {
Rect rect =newRect();
// 获取root在窗体的可视区域
rootView.getWindowVisibleDisplayFrame(rect);
// 当前视图最外层的高度减去现在所看到的视图的最底部的y坐标
int rootInvisibleHeight =rootView.getRootView().getHeight() - rect.bottom;
// 若rootInvisibleHeight高度大于100,则说明当前视图上移了,说明软键盘弹出了
if(rootInvisibleHeight > DisplayUtils.dp2px(100)) {
//软键盘弹出来的时候
int[] location =new int[2];
// 获取scrollToView在窗体的坐标
mGlobalLayout.getLocationInWindow(location);
// 计算root滚动高度,使scrollToView在可见区域的底部
intsrollHeight = (location[1] +mGlobalLayout.getHeight()) - rect.bottom;
if(srollHeight >0) {
rootView.scrollTo(0,srollHeight);
InputMethodUtils.setIsInputMethodShowing(true);
DataChangeNotification.getInstance().notifyDataChanged(IssueKey.INPUT_METHOD_OPENED);
}
}else{
// 软键盘没有弹出来的时候
rootView.scrollTo(0,0);
InputMethodUtils.setIsInputMethodShowing(false);
DataChangeNotification.getInstance().notifyDataChanged(IssueKey.INPUT_METHOD_CLOSED);
}
}
});
其中rootView表示的是view的根布局;mGlobalLayout表示需要变动高度的layout;
源码以后再贴










网友评论