http://www.cnblogs.com/csonezp/p/5065624.html
最近做的项目碰到个问题,a界面是fragment+recyclerview,b界面带个edittext,并且会自动获得焦点弹出软键盘。由a界面进入b界面,再结束b界面返回a界面,就会在a界面上留下一片和软键盘大小相同的灰色区域,具体原因搞了很久也不清楚。但是问题总是要解决的,我在a的fragment上折腾了半天,始终没什么用。然后就想着在b界面折腾折腾,关闭activity的时候先收起挼键盘,软键盘收起完毕再finish。
InputMethodManager中并没有软键盘收起的监听事件,上网查也没查到。既然找不到特定的监听事件,那就要从其他方面入手了。想到软键盘弹出的时候窗口的size会改变,正好b的逻辑不设计窗口size的改变,于是就重写b最底层的layout的onsizechange事件,用窗口size来代替软键盘的弹出/收起事件。
首先定义个listener:
/**
* Created by csonezp on 15-12-21.
*/
public interface InputWindowListener {
void show(); void hidden();
}
这个监听器是用来通知activity的。
b界面的最底层布局是RelativeLayout,于是我们就要重写一个RelativeLayout:
/**
* Created by csonezp on 15-12-21.
* 用onsizechange来模拟实现监听软键盘的弹出收起事件
*/
public class IMMListenerRelativeLayout extends RelativeLayout {
private InputWindowListener listener; public IMMListenerRelativeLayout(Context context) {
super(context);
} public IMMListenerRelativeLayout(Context context, AttributeSet attrs) {
super(context, attrs);
} public IMMListenerRelativeLayout(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
} @Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
if (oldh > h) {
L.d("input window show");
listener.show();
} else{
L.d("input window hidden");
listener.hidden();
}
} public void setListener(InputWindowListener listener) {
this.listener = listener;
} }
名字不要吐槽了,随便起的。
重点看onSizeChanged方法,如果是软键盘由收起变成弹出,那oldh就是全屏高度,h就是全屏高度减去软键盘的高度;如果软键盘由弹出变成收起,则h为全屏高度,oldh反之。
由此我们就可以判断出软键盘的状态了。
在activity的布局里,将原来的RelativeLayout换成自定义的布局,然后
mainlayout.setListener(new InputWindowListener() {
@Override
public void show() { } @Override
public void hidden() { }
});
就可以做自己想做的事了