csonezp

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

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

就可以做自己想做的事了

posted on 2015-12-22 09:40  csonezp  阅读(13375)  评论(0编辑  收藏  举报