转载

Android 另类方法监听软键盘的弹出收起事件

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() {                             }         }); 

就可以做自己想做的事了

正文到此结束
Loading...