美文网首页
优雅实现键盘弹出背景不上移的问题

优雅实现键盘弹出背景不上移的问题

作者: 一粒渣 | 来源:发表于2017-03-06 15:41 被阅读0次

之前在解决键盘弹出会吧背景顶上去的问题的时候遇到了很多坑,在网上找到的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;

源码以后再贴

相关文章

网友评论

      本文标题:优雅实现键盘弹出背景不上移的问题

      本文链接:https://www.haomeiwen.com/subject/uznwmttx.html