项目中经常遇到软键盘覆盖布局的问题,因为android中没有专门的api去获取键盘的高度,因此只有另辟蹊径去监控键盘的状态,今天得空将经验分享一下,先上代码
public class MainActivity extends Activity {
private LinearLayout rootview;
private Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
rootview = (LinearLayout) findViewById(R.id.root);
button = (Button) findViewById(R.id.bt);
viewscroll(rootview, button);
}
//整体布局向上滚动
private void viewscroll(final View rootView, final View scrollerView) {
//因为获取view的测量结果,和activity的生命周期是异步的,因此才用这个方法可以获取view的测量结果
rootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
//获取rootview在窗体的可视区域
Rect rect = new Rect();
rootView.getWindowVisibleDisplayFrame(rect);
Log.w("控件的可见顶部坐标", String.valueOf(rect.top));
Log.w("控件的可见底部高度", String.valueOf(rect.bottom));
//获取rootview在窗体的不可视区域
int rootviewinvisiblelity = rootView.getRootView().getHeight() - rect.bottom;
//如果不可视区域大于100(一般键盘的高度都是大于100的,这里只是随意设置的,可根据不同的手机设置不同的高度),则软键盘显示
if (rootviewinvisiblelity > 100) {
//获取button在窗体的坐标,将他的坐标存储到location数组中,location[0]代表的是x轴坐标,location[1]代表y轴坐标
int[] location = new int[2];
scrollerView.getLocationInWindow(location);
//计算rootview的滚动高度
int scrollerheight = location[1] + scrollerView.getHeight() - rect.bottom;
rootView.scrollTo(0, scrollerheight);
} else {
rootView.scrollTo(0, 0);
}
}
});
}
}
代码量本身不大,简单的做一下分析: