最近在做毕业设计,其中一个小功能就是要实现一个聊天窗口,聊天窗口里面要输入内容,输入法弹出来以后,信息气泡要抬起来,输入法收回去以后还要放下来。
在网上查了一圈,基本认定,是没有输入法弹出收回这个监听器的,只能从基础布局的大小入手,监听基础布局的大小改变,来判断输入法的弹出和收回。
View中已经提供了方法
/**
* This is called during layout when the size of this view has changed. If
* you were just added to the view hierarchy, you're called with the old
* values of 0.
*
* @param w Current width of this view.
* @param h Current height of this view.
* @param oldw Old width of this view.
* @param oldh Old height of this view.
*/
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
}
但View和我正在使用的RelativeLayout并不提供setOnSizeChangedListener()方法,因此,我们需要在RelativeLayout中添加一个setOnSizeChangedListener()方法,因此,需要把RelativeLayout重写,目的是重写里面的onSizeChange()方法。
public class ResizableRelativeLayout extends RelativeLayout {
//构造方法直接调用父类方法,此处已省略
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
}
}
那么问题来了,我的目的是让Listview里面的内容往上推,但是,我重写的是外面嵌套的布局,我怎么告诉用这个布局的Activity尺寸已经改变,然后让Activity做一些事呢?
public class ResizableRelativeLayout extends RelativeLayout {
private OnSizeChangeListener onSizeChangeListener;
public interface OnSizeChangeListener{
void onSizeChange(int width, int height, int oldWidth, int oldHeight);
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
onSizeChangeListener.onSizeChange(w,h,oldw,oldh);//在尺寸改变时,调用接口里面的那个方法,这个方法,是自己实现的,也就实现了方法传递
}
public void setOnSizeChangeListener(OnSizeChangeListener onSizeChangeListener){
this.onSizeChangeListener = onSizeChangeListener;
}
}
在Activity中,使用
resizableRelativeLayout.setOnSizeChangeListener(new ResizableRelativeLayout.OnSizeChangeListener() {
@Override
public void onSizeChange(int width, int height, int oldWidth, int oldHeight) {
//需要在尺寸改变时做的事
}
});
这样,就实现了对尺寸改变的监听。
resizableRelativeLayout.setOnSizeChangeListener(new ResizableRelativeLayout.OnSizeChangeListener() {
@Override
public void onSizeChange(int width, int height, int oldWidth, int oldHeight) {
if(oldHeight>height)
listView.setSelection(listView.getAdapter().getCount()-1);
}
});
运行后发现,确实可以监听输入法弹出和收回,但是ListView并没有跟着动,大概想一下原因就是,输入法弹出是有延迟的,具体原因还没有想,解决方法是让ListView延迟抬起。
resizableRelativeLayout.setOnSizeChangeListener(new ResizableRelativeLayout.OnSizeChangeListener() {
@Override
public void onSizeChange(int width, int height, int oldWidth, int oldHeight) {
if(oldHeight>height)
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
listView.setSelection(listView.getAdapter().getCount()-1);
}
},500);
}
});
这样,就实现了监听输入法弹出和收回。