zoukankan      html  css  js  c++  java
  • 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() {
                   
                }
            });

    就可以做自己想做的事了

  • 相关阅读:
    线性回归和 逻辑回归 的思考(参考斯坦福 吴恩达的课程)
    数据结构算法基础-内部排序算法
    机器学习《test》
    day1.接口测试(概念、Postman、SoapUI、jmeter)
    SQL2000 3核6核 CUP 安装SP4
    SQL常用语句
    SQL SERVER 2000数据库置疑处理
    常用终端命令
    c++ 位操作
    计算机为什么用补码存储数据?
  • 原文地址:https://www.cnblogs.com/csonezp/p/5065624.html
Copyright © 2011-2022 走看看