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() { } });
就可以做自己想做的事了