主要解决的问题:
页面布局中没有使用scrollview,但是有输入框,当获取焦点后,输入框会被键盘遮住,或其他控件被键盘遮住,无法滑动看到被键盘遮住的控件,使用以下代码,可解决此问题
调用部分:
layMain = findViewById(R.id.layMain);//该activity的根布局的控件
layLogin = findViewById(R.id.layLogin);//需要显示的键盘之上的最后一个View,该view必须值根布局的子view
//在Activity的onCreate里添加如下方法
SoftKeyInputScrollBy.addLayoutListener(layMain,layLogin);
核心代码(SoftKeyInputScrollBy):
public class SoftKeyInputScrollBy {
/**
* addLayoutListener方法如下
* @param main 根布局,必须是正layout的根布局
* @param scroll 需要显示的键盘之上的最后一个View,该view必须值根布局的子view
*/
public static void addLayoutListener(final View main,final View scroll) {
main.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
Rect rect =new Rect();
//1、获取main在窗体的可视区域
main.getWindowVisibleDisplayFrame(rect);
//2、获取main在窗体的不可视区域高度,在键盘没有弹起时,main.getRootView().getHeight()调节度应该和rect.bottom高度一样
int screenHeight =main.getRootView().getHeight();//屏幕高度
int mainInvisibleHeight =main.getRootView().getHeight() - rect.bottom;
Log.d("gyb","mainInvisibleHeight->" + mainInvisibleHeight +"--screenHeight---->" + screenHeight +"--rect.bottom-->" + rect.bottom +"");
//3、不可见区域大于屏幕本身高度的1/4:说明键盘弹起了
if (mainInvisibleHeight > screenHeight /4) {
int[] location =new int[2];
scroll.getLocationInWindow(location);
// 4、获取Scroll的窗体坐标,算出main需要滚动的高度
int srollHeight = (location[1] +scroll.getHeight()) - rect.bottom;
Log.d("gyb","--location---->" + location[0] +"<-->" + location[1] +"--srollHeight ->" +scroll.getHeight() +"---srollHeight-->"+ srollHeight);
//5、让界面整体上移键盘的高度
main.scrollBy(0, srollHeight);
}else {
//3、不可见区域小于屏幕高度1/4时,说明键盘隐藏了,把界面下移,移回到原有高度
main.scrollTo(0,0);
}
}
});
}
}
补充说明:
activity的xml布局格式:
具体原理解释请看这位博主的详细讲解:
https://blog.csdn.net/smileiam/article/details/69055963###;