【背景】

在很多App开发过程中需要在Activity中监听Android设备的软键盘弹起与关闭,但是Android似乎没有提供相关的的监听API给我们来调用,本文提供了一个可行的办法来监听软键盘的弹起与关闭。

【预备知识】

在manifest文件中可以设置Activity的android:windowSoftInputMode属性,这个属性值常见的设置如下:

android:windowSoftInputMode="stateAlwaysHidden|adjustPan"

那么这里值的含义列表如下:

【1】stateUnspecified:软键盘的状态并没有指定,系统将选择一个合适的状态或依赖于主题的设置

【2】stateUnchanged:当这个activity出现时,软键盘将一直保持在上一个activity里的状态,无论是隐藏还是显示

【3】stateHidden:用户选择activity时,软键盘总是被隐藏

【4】stateAlwaysHidden:当该Activity主窗口获取焦点时,软键盘也总是被隐藏的

【5】stateVisible:软键盘通常是可见的

【6】stateAlwaysVisible:用户选择activity时,软键盘总是显示的状态

【7】adjustUnspecified:默认设置,通常由系统自行决定是隐藏还是显示

【8】adjustResize:该Activity总是调整屏幕的大小以便留出软键盘的空间

【9】adjustPan:当前窗口的内容将自动移动以便当前焦点从不被键盘覆盖和用户能总是看到输入内容的部分

【示例】

(1)首先我们需要将监听所在的Activity在Manifest文件中的设置为如下形式:

        <activityandroid:name="com.bear.softkeyboardlistener.MainActivity"android:label="@string/app_name"android:windowSoftInputMode="stateAlwaysHidden|adjustResize" ><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity>

这样设置之后,当有软键盘弹起来的时候,Activity的布局大小会被压缩上去,但是你仍然可以通过滑动浏览所有。

(2)我们要为Activity的最外面的Layout设置一个OnLayoutChangeListener监听器:

import com.bear.bearbroadcastreceiver.R;import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnLayoutChangeListener;
import android.widget.Toast;public class MainActivity extends Activity implements OnLayoutChangeListener{//Activity最外层的Layout视图private View activityRootView;//屏幕高度private int screenHeight = 0;//软件盘弹起后所占高度阀值private int keyHeight = 0;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);activityRootView = findViewById(R.id.root_layout);//获取屏幕高度screenHeight = this.getWindowManager().getDefaultDisplay().getHeight();//阀值设置为屏幕高度的1/3keyHeight = screenHeight/3;}@Overrideprotected void onResume() {super.onResume();//添加layout大小发生改变监听器activityRootView.addOnLayoutChangeListener(this);}@Overridepublic void onLayoutChange(View v, int left, int top, int right,int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {//old是改变前的左上右下坐标点值,没有old的是改变后的左上右下坐标点值//        System.out.println(oldLeft + " " + oldTop +" " + oldRight + " " + oldBottom);
//      System.out.println(left + " " + top +" " + right + " " + bottom);//现在认为只要控件将Activity向上推的高度超过了1/3屏幕高,就认为软键盘弹起if(oldBottom != 0 && bottom != 0 &&(oldBottom - bottom > keyHeight)){Toast.makeText(MainActivity.this, "监听到软键盘弹起...", Toast.LENGTH_SHORT).show();}else if(oldBottom != 0 && bottom != 0 &&(bottom - oldBottom > keyHeight)){Toast.makeText(MainActivity.this, "监听到软件盘关闭...", Toast.LENGTH_SHORT).show();}}

下面是整个demo源码的下载链接:

Android SoftKeyboard Listener Demo

【Android应用】【监听软键盘弹起与关闭】相关推荐

  1. Android App监听软键盘按键的三种方式与改变软键盘右下角确定键样式

    Android App监听软键盘按键的三种方式与改变软键盘右下角确定键样式 actionNone : 回车键,按下后光标到下一行 actionGo : Go, actionSearch : 放大镜 a ...

  2. android 代码设置 键盘适应_Android自适应软键盘的Dialog以及监听软键盘弹起

    最近项目中遇到一个需求:新手引导.跟一般的新手引导没有什么太大区别,思路都是搞一个带阴影的遮罩层,然后在上边儿给一些提示性的文字,由于需求中有些特殊的地方,所以我用了一个全屏的dialog(而且,di ...

  3. h5 移动端 监听软键盘弹起、收起

    前面一篇博客 h5 安卓 键盘弹起界面适配 修改webview高度提到了在adnroid中如何监听软键盘的弹起与收起,是利用的窗口的高度发生变化 window.onresize事件来做突破点的,但是i ...

  4. h5 移动端 监听软键盘弹起、收起

    前面一篇博客 h5 安卓 键盘弹起界面适配 修改webview高度提到了在adnroid中如何监听软键盘的弹起与收起,是利用的窗口的高度发生变化 window.onresize事件来做突破点的,但是i ...

  5. Android App监听软键盘按键的三种方式(转)

    最近有类似需求,在csdn上刚好发现,粘贴过来,以防止忘记喽 前言: 我们在android手机上面有时候会遇到监听手机软键盘按键的时候,例如:我们在浏览器输入url完毕后可以点击软键盘右下角的&quo ...

  6. Android App监听软键盘按键的三种方式

    前言: 我们在android手机上面有时候会遇到监听手机软键盘按键的时候,例如:我们在浏览器输入url完毕后可以点击软键盘右下角的"GO"按键加载url页面:在点击搜索框的时候,点 ...

  7. Android App监听软键盘按键的三种方式 以及 输入法删除退格键的冲突问题解决

    输入法删除退格键的冲突问题解决 /***返回键处理 */@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {if( even ...

  8. H5 (React) 移动端监听软键盘弹起、收起

    前言:H5 有时底部按钮是固定定位,当页面上面需要用到输入内容时,会弹起软键盘,然后把底部固定的按钮也弹起来了,我们希望弹起软键盘时,底部的固定定位按钮隐藏,这里就需要对移动端软键盘弹起收起进行监听. ...

  9. android中监听软键盘的弹出与隐藏,并获取软键盘的高度

    最近项目中有一个需求上弹出软键盘的时候,输入框位移至输入框上方,但是Activity中其他的VIew都不动.这个需求需要监听软软键盘的弹出与隐藏,并获取键盘的高度.上网找了一下发现,Android竟然 ...

最新文章

  1. java用opencv实现滤镜_opencv滤镜-二值化实现黑白滤镜
  2. 棋盘游戏的人工智能(二)------剪支
  3. MySQL 查看约束,添加约束,删除约束 添加列,修改列,删除列
  4. 产品策略研究期的数据分析与挖掘
  5. opencv+pythons相机标定源码解析
  6. idea的总部_Studio Didea新总部办公室,意大利 / Studio Didea
  7. 5月第二周全球五大顶级域名总量新增10.5万个
  8. (转载)正则表达式30分钟入门教程
  9. python文本文件读写的3种方法
  10. vscode配置js环境_VS Code配置Python开发环境
  11. jquery easyui 封装
  12. HFSS - 圆极化矩形微带天线设计与仿真
  13. Kettle下载和安装
  14. 91 全能地图下载器和 bigemap地图下载器哪个好用?
  15. 自然语言处理的学习心得
  16. 什么叫单模光纤_单模光纤是什么?单模光纤有哪些分类?
  17. java外文文库_java外文文献毕业设计
  18. 删除文件提示该路径不存在 解决办法
  19. 华为PPPoE、PPP/MP、IP-Trunk配置
  20. 【回顾】“双11”首个元宇宙日 中国移动通信联合会元宇宙产业委员会揭牌 《元宇宙产业宣言》发布

热门文章

  1. 关于模拟器adb 端口查看
  2. matlab编写关于离散的傅里叶变换
  3. python量化选股策略 源码_常见的十大量化投资策略(附源码)
  4. java 多少位表示一个字_一个字多少个字符
  5. NanoMsg框架|Android Studio编译NanoMsg源码
  6. SocketPro完整使用教程分享,手把手指导
  7. css如何让背景上下居中显示,CSS有哪些方式可以实现垂直居中?
  8. jQuery实现别踩白块小游戏(简易版)
  9. HP Smart连接异常缓慢,点击扫描闪退
  10. Android 打包后apk安装失败