项目要注册会员,需要的输入框较多,但是后边几个就会被输入框遮挡,网上找了好多方法都不行,最后找到了篇相关博客,试了下 完美解决我的需求。传送门
这是修改之前的截图
这是修改之后的样子
写输入框的焦点监听,获取焦点的时候显示当前输入框到输入法上边。
这样式是我自己改过的,我让他显示下一个输入框,就不用滑动页面就可以点击下一个输入框输入。
下面是代码
et_invitation_code.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
controlKeyboardLayout(ll_scroll, et_invitation_code);
}
});
/**
* @param root 最外层布局,需要调整的布局
* @param scrollToView 被键盘遮挡的scrollToView,滚动root,使scrollToView在root可视区域的底部
*/
private void controlKeyboardLayout(final View root, final View scrollToView) {
root.getViewTreeObserver().addOnGlobalLayoutListener(
new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
Rect rect = new Rect();
// 获取root在窗体的可视区域
root.getWindowVisibleDisplayFrame(rect);
// 获取root在窗体的不可视区域高度(被其他View遮挡的区域高度)
int rootInvisibleHeight = root.getRootView().getHeight() - rect.bottom;
// 若不可视区域高度大于100,则键盘显示
if (rootInvisibleHeight > 100) {
int[] location = new int[2];
// 获取scrollToView在窗体的坐标
scrollToView.getLocationInWindow(location);
// 计算root滚动高度,使scrollToView在可见区域
int srollHeight = (location[1]
+ scrollToView.getHeight() + dp2px(10)) - rect.bottom;
root.scrollTo(0, srollHeight);
} else {
// 键盘隐藏
root.scrollTo(0, 0);
}
}
});
}
private int dp2px(int dpValue) {
final float scale = getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}
主要就是 controlKeyboardLayout 方法了。