码迷,mamicode.com
首页 > 移动开发 > 详细

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

时间:2015-12-22 10:15:44      阅读:239      评论:0      收藏:0      [点我收藏+]

标签:

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

就可以做自己想做的事了

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

标签:

原文地址:http://www.cnblogs.com/csonezp/p/5065624.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!