【Android】软键盘弹出收起事件监听_android 键盘弹出事件_无人是孤岛_一书一世界的博客-程序员秘密

技术标签: Android  

在开发过程中有时候会有监听软键盘弹出收起事件的需求,在此作记录,以便以后再次遇到,少走弯路。

弹出和隐藏软键盘方法:

 /**
     * 弹出软键盘
     */
    public void showKeyBoard(View v) {
        InputMethodManager imm = (InputMethodManager) this.getSystemService(Context.INPUT_METHOD_SERVICE);
        if(null != imm) {
            v.requestFocus();
            imm.showSoftInput(v, 0);
        }
        isKeyboardShow = true;
    }

 /**
     * 隐藏软键盘
     */
    public void hideKeyBoard(View v) {
        InputMethodManager imm = (InputMethodManager) this.getSystemService(Context.INPUT_METHOD_SERVICE);
        if(null != imm) {
            v.requestFocus();
            imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
        }
        isKeyboardShow = false;
    }

基于以上的弹出收起操作,给出监听实体类:

/**
 * Created by Luzj on 2018/8/20.
 *
 * 软键盘弹出收起监听
 */
public class SoftKeyBoardListener {

    private View rootView;//activity的根视图
    int rootViewVisibleHeight;//纪录根视图的显示高度
    private OnSoftKeyBoardChangeListener onSoftKeyBoardChangeListener;

    public SoftKeyBoardListener(Activity activity) {
        //获取activity的根视图
        rootView = activity.getWindow().getDecorView();

        //监听视图树中全局布局发生改变或者视图树中的某个视图的可视状态发生改变
        rootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                //获取当前根视图在屏幕上显示的大小
                Rect r = new Rect();
                rootView.getWindowVisibleDisplayFrame(r);

                int visibleHeight = r.height();
                System.out.println(""+visibleHeight);
                if (rootViewVisibleHeight == 0) {
                    rootViewVisibleHeight = visibleHeight;
                    return;
                }

                //根视图显示高度没有变化,可以看作软键盘显示/隐藏状态没有改变
                if (rootViewVisibleHeight == visibleHeight) {
                    return;
                }

                //根视图显示高度变小超过200,可以看作软键盘显示了
                if (rootViewVisibleHeight - visibleHeight > 200) {
                    if (onSoftKeyBoardChangeListener != null) {
                        onSoftKeyBoardChangeListener.keyBoardShow(rootViewVisibleHeight - visibleHeight);
                    }
                    rootViewVisibleHeight = visibleHeight;
                    return;
                }

                //根视图显示高度变大超过200,可以看作软键盘隐藏了
                if (visibleHeight - rootViewVisibleHeight > 200) {
                    if (onSoftKeyBoardChangeListener != null) {
                        onSoftKeyBoardChangeListener.keyBoardHide(visibleHeight - rootViewVisibleHeight);
                    }
                    rootViewVisibleHeight = visibleHeight;
                    return;
                }

            }
        });
    }

    private void setOnSoftKeyBoardChangeListener(OnSoftKeyBoardChangeListener onSoftKeyBoardChangeListener) {
        this.onSoftKeyBoardChangeListener = onSoftKeyBoardChangeListener;
    }

    public interface OnSoftKeyBoardChangeListener {
        void keyBoardShow(int height);

        void keyBoardHide(int height);
    }

    public static void setListener(Activity activity, OnSoftKeyBoardChangeListener onSoftKeyBoardChangeListener) {
        SoftKeyBoardListener softKeyBoardListener = new SoftKeyBoardListener(activity);
        softKeyBoardListener.setOnSoftKeyBoardChangeListener(onSoftKeyBoardChangeListener);
    }
}

在Activity中注册监听:

SoftKeyBoardListener.setListener(this, onSoftKeyBoardChangeListener);

声明监听实例:

/**
     * 软键盘弹出收起监听
     */
    private SoftKeyBoardListener.OnSoftKeyBoardChangeListener onSoftKeyBoardChangeListener = new SoftKeyBoardListener.OnSoftKeyBoardChangeListener() {
        @Override
        public void keyBoardShow(int height) {
            show("键盘显示 高度 : " + height);
        }
        @Override
        public void keyBoardHide(int height) {
            show("键盘隐藏 高度 : " + height);
        }
    };

 ps:

有时候弹出软键盘会使布局出现出乎预期的现象,这时候要考虑Manifest文件中Activity的windowSoftInputMode属性。

在我的开发中,想做软键盘弹出时,部分屏幕出现蒙层的结果,但是在软键盘弹出时蒙层总会自动消失,这时候在Manifest的相应Activity中加上:

android:windowSoftInputMode="adjustPan"

 结果正常。

总结:软键盘导致的布局问题,往往在windowSoftInputMode属性中可以找到答案。

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/sko121/article/details/82387507

智能推荐

程序员屏保:代码没写完,哪有脸睡觉 | 每日趣闻_CSDN 程序人生的博客-程序员秘密

往 期 趣 闻☞众编程语言之父大合集,不小心知道了什么 | 每日趣闻☞互联网人生存指南 | 每日趣闻☞一图读懂浏览器演变史 | 每日趣闻☞太真实!深刻解读论文里的话术| 每日趣闻☞我和我...

【微信小程序】微信开发小项目+简易计算器+代码_微信小程序计算机代码_初露微微的博客-程序员秘密

效果图:2.index.json代码:{ "usingComponents": {}, "navigationBarBackgroundColor": "#fff", "navigationBarTitleText": "计算器", "navigationBarTextStyle": "black"}3.index.wxsspage{ display: fl...

系分考试_iteye_1176的博客-程序员秘密

上个星期日,第三次参加了系统分析师考试。这次试题难度从总体上来说不是很大,早上考数学的题目比较多,中午考的是知识面的广度,下午的论文题目第一个直接没看懂(系统体系结构评估方法),第二个到第四个分别是敏捷、SOA、SaaS,毫不犹豫的选择了敏捷。还记得去年(2007年下半年)这个时候的考试论文也是敏捷,挂了。不知道这次能否通过,这次没怎么复习,公司项目时间紧啊。也许早上和中午挂的概率更大点,呵呵。。...

解决django前后端一体和前后端分离(前端vue)post请求报403 forbidden的问题_vue 403 (forbidden)_Dream_it_possible!的博客-程序员秘密

文章目录前后端一体1) 使用templates显示前端html页面2)定义post请求的Form表单3) 跨域攻击原理分析4) 解决方法前后端分离前后端一体1) 使用templates显示前端html页面  在setings里添加配置, dirs为指定模块下的templates目录文件夹:# 配置dbTEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates',

Vue学习第二天,组件注册_annuo0615的博客-程序员秘密

Vue组件注册分为全局注册和局部注册,全局注册。Vue.component('my-li',{ template: '<div>父组件</div>' });这里推荐使用驼峰形式的写法,上面是一个简单的全局组件,在使用new Vue挂载后就可以在全局范围内使用。这里主要说如何嵌套使用,下面是一个例子...

数据挖掘近年来的研究方向、方法总结_数据分析挖掘 技术路线_ee-redbull的博客-程序员秘密

数据挖掘近年来的研究方向、方法总结一、研究方向数据挖掘作为一个跨学科主题,它是用人工智能、机器学习、统计学和数据库交叉的方法在相对较大型的数据集中发现模式的计算过程。其目标是从数据集中提取信息并将其转换成可理解的结构,以进一步分析使用。对其的研究大致可分如下4类:(1)基础理论研究方向数据挖掘是一门交叉学科,因此涉及的基础理论也是多学科的基础。其包含的基础理论研究涉及到规则和模式挖掘、分类、聚类、话题学习、时间空间数据挖掘、机器学习方法,监督、非监督、半监督等方面,同时这些也是人工智能领域的相关研

随便推点

高通(QCOM)camera kernel新架构通过ION拿到sensor参数_vidioc_cam_control_我有一个梦想丶L的博客-程序员秘密

前言:ION 的前任是 PMEM,ION,最显著的特点是它可以被用户空间的进程之间或者内核空间的模块之间进行内存共享,而且这种共享可以是零拷贝的。在实际使用中,ION 和 VIDEOBUF2、DMA-BUF、V4L2 等结合的很紧密。ION在内核中被当做一个misc设备来注册,通常user通过打开/dev/ion来对内存进行操作,在高通710平台的camera流程中,拿取camera参数与之前的660平台不太一样,660平台通过调用v4l-subdev的ioctl传递camera sensor的参数,在

bootstrap 居中 表格中,如何在Bootstrap中将表格水平居中_weixin_39866857的博客-程序员秘密

This my code. What I'm trying to do is to get this table at the center of the container. But instead, it aligns to the left by default when I use the "container" class, and it uses the full width when...

通过JAVA获取56视频_sunlightcs的博客-程序员秘密

通过JAVA获取56视频,现在很多社会网站都有这个功能,用户输入56视频地址后,能找到对应的视频及视频的缩略图,有些社区网站还能获取到视频的时长。比如:新浪微博就有这个功能,当用户输入视频网址后,就能获取到相应的视频地址及视频的缩略图。[code="java"]import java.io.IOException;import java.io.UnsupportedEncodingEx...

提高编译效率的Keil C编程技巧_keil除法怎么用_abbing的博客-程序员秘密

1、选择合适的算法和数据结构应该熟悉算法语言,知道各种算法的优缺点,具体资料请参见相应的参考资料,有很多计算机书籍上都有介绍。将比较慢的顺序查找法用较快的二分查找或乱序查找法代替,插入排序或冒泡排序法用快速排序、合并排序或根排序代替,都可以大大提高程序执行的效率。.选择一种合适的数据结构也很重要,比如你在一堆随机存放的数中使用了大量的插入和删除指令,那使用链表要快得多。数组与指针语句具有十分密码的

如何优化C语言代码(转)_newusb的博客-程序员秘密

 1、选择合适的算法和数据结构    应该熟悉算法语言,知道各种算法的优缺点,具体资料请参见相应的参考资料,有很多计算机书籍上都有介绍。将比较慢的顺序查找法用较快的二分查找或乱序查找法代替,插入排序或冒泡排序法用快速排序、合并排序或根排序代替,都可以大大提高程序执行的效率。.选择一种合适的数据结构也很重要,比如你在一堆随机存放的数中使用了大量的插入和删除指令,那使用链表要快得多。    数组与

安装Ubuntu系统_weixin_30566063的博客-程序员秘密

1.“failed to load ldlinux.c32”问题笔记本上本来有个win7系统,由于学习需要安装linux系统,因为ubuntu是桌面版的,选择了ubuntu,制作了一个U盘系统盘,但是从U盘启动电脑的时候一直提示“failed to load ldlinux.c32”,后来百度了一下,是因为用UltraISO.exe,有建议说用一个软件工具:Win32 Disk Imager,...

推荐文章

热门文章

相关标签