在开发中,经常会遇到键盘挡住输入框的情况,比如登录界面或注册界面,弹出的软键盘把登录或注册按钮挡住了,用户必须把软键盘收起,才能点击相应按钮,这样的用户体验非常不好。
解决方案: 第一步:使用getWindowVisibleDisplayFrame()来获取当前窗口可视区域大小的。它是View类下的一个方法 第二步:使用scrollTo方法,当键盘弹起时,计算出不可视区域高度,让界面整体上移;键盘收起后,让界面整体下移参考文章:
getWindowVisibleDisplayFrame():https://www.cnblogs.com/ldq2016/p/6835366.html
整体移动:https://blog.csdn.net/smileiam/article/details/69055963
全局的listener:
private ViewTreeObserver.OnGlobalLayoutListener mOnGlobalLayoutListener;
在进入界面时注册它:
/**
* 添加GlobalLayoutListener用于处理软键盘弹起遮盖问题
*/
private void addGlobalLayoutListener() {
if (mRootLayout != null && mLocationEditText != null) {
if (mOnGlobalLayoutListener == null) {
mOnGlobalLayoutListener = new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
Rect rect = new Rect();
mRootLayout.getWindowVisibleDisplayFrame(rect);//这个是获取可见区域的关键
int mainInvisibleHeight = mRootLayout.getRootView().getHeight() - rect.bottom; //这里根据可见区域计算出不可见区域
if (mainInvisibleHeight > DimenUtils.getWindowHeight() / 4 && mLocationEditText.isFocused()) {
mRootLayout.scrollTo(0, DimenUtils.getWindowHeight() / 4); //1/4的原因是我们自己的edittext大概在屏幕的下1/4处,因此屏幕整体上移1/4就可以把遮挡住的edittext显示出来了,这里需要根据自己项目情况估算下合适的高度
} else {
mRootLayout.scrollTo(0, 0);
}
}
};
}
mRootLayout.getViewTreeObserver().addOnGlobalLayoutListener(mOnGlobalLayoutListener);
}
}
离开时注销掉:
/**
* 移除GlobalLayoutListener
*/
private void removeOnGlobalLayoutListener() {
if (mRootLayout != null && mOnGlobalLayoutListener != null) {
mRootLayout.getViewTreeObserver().removeOnGlobalLayoutListener(mOnGlobalLayoutListener);
}
}
具体为什么移动1/4,这个就要根据自己的界面需求自己估算了:
if (mainInvisibleHeight > DimenUtils.getWindowHeight() / 4 && mLocationEditText.isFocused()) {
mRootLayout.scrollTo(0, DimenUtils.getWindowHeight() / 4);
} else {
mRootLayout.scrollTo(0, 0);
}