首先来看一下两种情况,对用户来说体验真是不好
第一种:试图被遮盖,用户看不到输入的框框
第二种情况:试图整个被往上挤压,导致博主上面的标题栏被顶上去了
这两种站在用户的角度上都是不好的,所以给出一种方案
思路:获取到键盘弹出的时候的高度,然后让部分试图移动一下下,为什么说部分试图呢?因为就像博主这里的标题栏博主就不希望他有所改变,下面是实现的效果图
键盘弹出的时候并没有相应的api给我们调用,但是可以通过另一种方式实现.我们就设置软键盘的模式是遮盖我们的布局的.那么键盘弹出必然导致我们的activity的根试图被覆盖,这时候会导致视图的重新调整,所以这时候我们只需要监听视图被重新安排了的回调,然后根据整个根布局的高度和可见的高度算出被遮盖的高度,也就是键盘的高度,然后,在让部分布局向上滚动一段距离,这段距离就是键盘的高度!
那么上代码
/**
* @param root 最外层布局
* @param needToScrollView 要滚动的布局,就是说在键盘弹出的时候,你需要试图滚动上去的View,在键盘隐藏的时候,他又会滚动到原来的位置的布局
*/
private void controlKeyboardLayout(final View root, final View needToScrollView) {
root.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
private Rect r = new Rect();
@Override
public void onGlobalLayout() {
//获取当前界面可视部分
ConversationAct.this.getWindow().getDecorView().getWindowVisibleDisplayFrame(r);
//获取屏幕的高度
int screenHeight = ConversationAct.this.getWindow().getDecorView().getRootView().getHeight();
//此处就是用来获取键盘的高度的, 在键盘没有弹出的时候 此高度为0 键盘弹出的时候为一个正数
int heightDifference = screenHeight - r.bottom;
needToScrollView.scrollTo(0, heightDifference);
}
});
}
此方法还不是最好的方法,如果l列表中的item只有少数的,那么键盘弹出之后,信息就被滚动上去了,所以后来博主又写了另一种方法,就是算出键盘弹出的时候,列表或者说需要被调整的布局的高度.那么也是可以达到要求的
有问题欢迎留言哦