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

    就可以做自己想做的事了

  • 相关阅读:
    Taro api封装
    taro中如何定义全局变量
    移动端悬浮框可移动,可回弹,Vue and React
    VS2015 安装mvc4安装包以及vs2010 sp1后导致Razor语法失效代码不高亮(能正常运行)/视图页面无法智能提示(.cshtml)解决办法
    C#6.0新特性的尝试
    Visual Studio Code 添加设置代码段(snippet)
    AngularJs的$http发送POST请求,php无法接收Post的数据解决方案
    [Asp.net mvc] 在Asp.net mvc 中使用MiniProfiler
    [Asp.net mvc]实体更新异常:存储区更新、插入或删除语句影响到了意外的行数(0)。实体在加载后可能被修改或删除。
    win8.1右键新建菜单添加新建php文件
  • 原文地址:https://www.cnblogs.com/csonezp/p/5065624.html
Copyright © 2011-2022 走看看