概述

针对“软键盘的遮挡”问题,最简单的方式就是将activity的windowSoftInputMode设置成adjustResize或者adjustPan。

android:windowSoftInputMode="adjustResize"
android:windowSoftInputMode="adjustPan"

其效果一般如下:

如上图,这样设置后能保证“当前操作的布局”在软键盘之上。
但是实际业务场景,可能需要的是“将整块布局”设置在软键盘之上,即Demo中的两个输入框和按钮都需要在软键盘之上。
如果需要实现这种需求,那么开发者就必须要监听软键盘的弹出弹回事件,然后手动来调整布局。

监听源码

监听实现的原理如下:

  • 监听当前页面contentView的布局变化
  • 如果contentView上移,那么是软键盘弹出,如果contentView底部与decorview一样,那么是弹回。
public class KeyBoardListenerHelper {//constantsprivate static final String TAG = "KeyBoardListenerHelper";//dataprivate WeakReference<Activity> weakActivity = null;//避免内存泄漏,使用弱引用private OnKeyBoardChangeListener onKeyBoardChangeListener;private final ViewTreeObserver.OnGlobalLayoutListener onGlobalLayoutListener =new ViewTreeObserver.OnGlobalLayoutListener() {@Overridepublic void onGlobalLayout() {if (!isActivityValid() || onKeyBoardChangeListener == null) {return;}try {Rect rect = new Rect();weakActivity.get().getWindow().getDecorView().getWindowVisibleDisplayFrame(rect);int screenHeight = weakActivity.get().getWindow().getDecorView().getHeight();int keyBoardHeight = screenHeight - rect.bottom;onKeyBoardChangeListener.OnKeyBoardChange(keyBoardHeight > 0, keyBoardHeight);} catch (Exception e) {Log.e(TAG, "onGlobalLayout error:" + e.getMessage());}}};public KeyBoardListenerHelper(Activity activity) {if (activity == null) {return;}weakActivity = new WeakReference<>(activity);try {//设置后才可以监听到软键盘的弹出,此处不能设置SOFT_INPUT_ADJUST_UNSPECIFIED或者SOFT_INPUT_STATE_UNSPECIFIED,其他都可以.activity.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);View content = weakActivity.get().findViewById(android.R.id.content);content.getViewTreeObserver().addOnGlobalLayoutListener(onGlobalLayoutListener);} catch (Exception e) {Log.e(TAG, "KeyBoardListenerHelper error:" + e.getMessage());}}//在不使用的时候需要及时销毁,避免内存泄漏或造成额外开销public void destroy() {Log.i(TAG, "destroy");if (!isActivityValid()) {return;}try {View content = weakActivity.get().findViewById(android.R.id.content);content.getViewTreeObserver().removeOnGlobalLayoutListener(onGlobalLayoutListener);} catch (Exception e) {Log.e(TAG, "destroy error:" + e.getMessage());}}public void setOnKeyBoardChangeListener(OnKeyBoardChangeListener listener) {Log.i(TAG, "setOnKeyBoardChangeListener");this.onKeyBoardChangeListener = listener;}public interface OnKeyBoardChangeListener {void OnKeyBoardChange(boolean isShow, int keyBoardHeight);}public boolean isActivityValid() {return weakActivity != null && weakActivity.get() != null;}
}

监听调用

调用步骤:

  1. 在需要的地方初始化
  2. 根据自己需要在软键盘弹出和弹回的时候控制布局变化
  3. 在不使用的及时释放不使用的监听器
public class MainActivity extends Activity {private KeyBoardListenerHelper keyBoardListenerHelper;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);keyBoardListenerHelper = new KeyBoardListenerHelper(this);keyBoardListenerHelper.setOnKeyBoardChangeListener(new KeyBoardListenerHelper.OnKeyBoardChangeListener() {@Override public void OnKeyBoardChange(boolean isShow, int keyBoardHeight) {//此处可以根据是否显示软键盘,以及软键盘的高度处理逻辑Log.i("testtest", "isShow: " + isShow + " keyBoardHeight:" + keyBoardHeight);}});}@Override protected void onDestroy() {super.onDestroy();if (keyBoardListenerHelper != null) {keyBoardListenerHelper.destroy();//避免内存泄漏,需要及时释放}}
}

android监听软键盘弹出弹回事件相关推荐

  1. Android 监听软键盘的高度并解决其覆盖输入框的问题

    1.前言 在某些项目中,我们常常需要自定义一个输入框,软键盘弹出时就把输入框顶上去,关闭时输入框再回到原位(比如下方的效果图,实际上各种 App 中的聊天界面和发布评论的界面大体都是这样).在这个过程 ...

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

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

  3. android 软键盘 状态,Android监听软键盘状态

    监听软键盘隐藏或显示,代码如下: /** * 监听软键盘状态 */ private void listenerInput() { final LinearLayout ll_main = (Linea ...

  4. Android监听软键盘开启关闭状态

    最近公司项目有一个功能点是监听软键盘的打开关闭状态,然后来展开不同的布局,后来在StackOverFlow上面找到一位大神提供了解决办法,大致做法如下: 在你需要监听状态的界面activity或者fr ...

  5. Android开发之监听软键盘状态(弹出收回)

    版权申明]非商业目的注明出处可自由转载 博文地址:https://blog.csdn.net/ShuSheng0007/article/details/81511764 出自:shusheng007 ...

  6. android 键盘回车按钮事件,android 监听软键盘 回车键

    InputMethodManager imm = (InputMethodManager)getActivity().getSystemService(Context.); imm.hideSoftI ...

  7. android监听键盘的隐藏,Android监听软键盘的显示和隐藏

    使用步骤 xml 布局文件布局,和普通的控件一下 获取SoftInputCanListenerEditText 实例,并设置监听器 Activity 注册的时候android:windowSoftIn ...

  8. android 键盘隐藏监听,安卓监听软键盘弹出与隐藏的两种方法

    需求: 现在有一个需求是点击一行文本框,弹出一个之前隐藏的输入框,输入完成后按返回键或者其他的东西隐藏键盘和输入框,将输入框的内容填充到文本框中. 实现: 拿到这个需求的第一反应就是写一个监听来监听键 ...

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

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

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

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

最新文章

  1. LeetCode_数组_中等题
  2. 什么是 SAP Commerce Cloud 的 Paragraph component
  3. 关于autoupgader的狗屎问题
  4. 推荐系统国内外团队介绍
  5. 澄海哪里学机器人编程_少年学机器人编程
  6. LYCMS自动采集影视视频网源码 安全无后门
  7. SQL Server中的报表–结合T-SQL和DAX查询以生成有效的报表
  8. C 语言怎么可能被淘汰呢?
  9. Java面向对象:对象的概念及面向对象的三个基本特征
  10. Luogu1886 滑动窗口 /【模板】单调队列
  11. jenkins pipeline分目录检出多代码库方法
  12. 乐橙本地录像回放不了_解决大华或乐橙录像机添加摄像头不能显示的密码问题...
  13. word2010撤销功能的恢复方法
  14. 暗影精灵4电脑win10系统重装+linux双系统安装
  15. linux centos 权限审核 polkitd进程 简介
  16. Win10/Win11下图片扩展安装 HEVC/HEIF/CR2等
  17. html 带箭头的提示框,css实现对话框-带箭头提示框
  18. 图解HTTP----web的攻击技术
  19. Setup time 和 Hold time
  20. c#程序员面试题汇总,方便自己记录

热门文章

  1. 【心情】2016ICPC青岛站打铁记
  2. 清洁机器人--屏幕显示LCD方案接口说明概述
  3. jt808终端鉴权_GitHub - SmallChi/JT808: JT808协议、GB808协议、道路运输车辆卫星定位系统-北斗兼容车载终端通讯协议(支持2013、2019版本)...
  4. 合并Windows系统镜像教程(Win 7+win 8.1 合盘)
  5. 【信管师-资料总结篇】一、立项管理
  6. 南京信息工程大学 第二届程序设计大赛团队赛 试题
  7. 我们可能都低估了浪潮存储
  8. 【​观察】做好数据到介质的连接者 新数据时代浪潮存储的行与思
  9. python:series详解和数据获取
  10. 扒一扒那些叫欧拉的定理们(八)——欧拉公式和自然对数的底e