AndroidUtilCode之KeyboardUtils:修复软键盘遮挡、内存泄漏等6个恼人Bug
AndroidUtilCode之KeyboardUtils修复软键盘遮挡、内存泄漏等6个恼人Bug【免费下载链接】AndroidUtilCode:fire: Android developers should collect the following utils(updating).项目地址: https://gitcode.com/gh_mirrors/an/AndroidUtilCode在 Android 开发中软键盘Soft Keyboard引发的坑几乎人人踩过遮挡输入框、Activity 内存泄漏、弹不出/收不回去等。AndroidUtilCode 工具库中的 KeyboardUtils 类就是专为解决软键盘难题而设计的一站式工具一个类就能搞定键盘的显示、隐藏、高度监听和内存泄漏修复新手几行代码即可上手。一、先认识 AndroidUtilCode 项目AndroidUtilCode 是一个持续更新的 Android 工具库集合覆盖了设备信息、文件、缓存、加密、UI 等上百个工具类。KeyboardUtils 就位于核心库 utilcode 模块中所有键盘相关的能力都集中在一个文件里工具类源码KeyboardUtils.java官方文档含完整 API 说明lib/utilcode/README.mdDemo 示例页面KeyboardActivity.kt整个项目按 lib 基础库层 feature 业务层分层组织KeyboardUtils 所在的 lib/utilcode 是最稳定的公共基础库二、快速接入一步搞定软键盘工具克隆仓库git clone https://gitcode.com/gh_mirrors/an/AndroidUtilCode将lib/utilcode作为依赖模块引入你的工程模块划分可通过 module_config.json 查看与配置即可直接调用com.blankj.utilcode.util.KeyboardUtils中的静态方法。得益于Utils统一了 Application 上下文见 Utils.java绝大多数方法不需要传 Activity随处可调用。三、6 个恼人 Bug 与对应解决方案Bug 1软键盘遮挡输入框页面却不自动调整现象明明设置了adjustResize键盘弹出后底部输入框仍被遮住页面布局纹丝不动——这是经典的 AndroidBug 5497部分系统版本上 adjustResize 失效。解决调用KeyboardUtils.fixAndroidBug5497(activity)。它会自动清除失效的adjustResize标记监听窗口可见区域变化实时把键盘高度补到内容视图的 paddingBottom 上页面立刻让位。// onCreate() 中一行搞定 KeyboardUtils.fixAndroidBug5497(this);Bug 2Activity 已销毁却被键盘拖住内存泄漏现象反复进出带输入框的页面LeakCanary报警——Activity 无法回收。原因系统InputMethodManager内部缓存了mCurRootView、mServedView等 View 引用即使页面关闭仍持有你的 Activity。解决在onDestroy()中调用KeyboardUtils.fixSoftInputLeaks(activity)。它通过反射清空 InputMethodManager 中指向本窗口的 4 个残留 View 字段切断引用链彻底消除泄漏。Override protected void onDestroy() { super.onDestroy(); KeyboardUtils.fixSoftInputLeaks(this); }Bug 3部分机型键盘死活弹不出来现象imm.showSoftInput()在华为、小米等 ROM 上时灵时不灵尤其在对话框、点击事件后调用。解决使用KeyboardUtils.showSoftInput(view)。它在标准调用之外增加了双保险通过ResultReceiver监听系统返回结果若系统反馈未改变/已隐藏会自动再toggleSoftInput()补一刀大幅提高了弹窗场景下的弹出成功率。KeyboardUtils.showSoftInput(editText); // 可靠地弹出键盘Bug 4Window 没有焦点控件时键盘收不回去现象弹出 Dialog 或页面没有任何获焦的 EditText 时调用隐藏键盘无效键盘赖着不走。解决调用KeyboardUtils.hideSoftInput(activity)Window 版本。源码里有个巧妙的兜底当窗口取不到焦点 View 时会自动往 DecorView 里塞一个带keyboardTagView标签的临时 EditText 来获取窗口令牌保证键盘必然能收到隐藏指令——细节见 KeyboardUtils.java 中hideSoftInput(Window)的实现。Bug 5无法感知键盘状态想做动态布局却无从下手现象想让界面根据键盘弹出高度动态移动/缩放控件原生 API 却拿不到键盘高度。解决两个方法配合使用——isSoftInputVisible(activity)实时判断键盘是否可见registerSoftInputChangedListener(activity, listener)注册监听键盘高度一变就回调并告诉你具体高度配合unregisterSoftInputChangedListener(window)注销即可。官方 Demo 就是这么用的在 KeyboardActivity.kt 中实时展示keyboardHeight并自动让焦点回到输入框效果直观。KeyboardUtils.registerSoftInputChangedListener(this) { height - titleItem.title keyboardHeight: $height }Bug 6点空白处键盘不收起用户只能手动按返回现象输入后点击页面空白区键盘不消失体验极差。解决两步走——调用KeyboardUtils.clickBlankArea2HideSoftInput()方法内直接给出了dispatchTouchEvent的完整参考代码复制进你的 Activity 即可实现点空白收起键盘对返回键等场景使用hideSoftInputByToggle(activity)它内置了 500ms 防抖判断避免和系统返回键的隐藏动作打架导致键盘忽闪忽现。四、常用 API 速查表场景方法一句话说明键盘遮挡输入框fixAndroidBug5497()手动补偿键盘高度修复 5497Activity 内存泄漏fixSoftInputLeaks()清理 InputMethodManager 残留引用弹出键盘showSoftInput(view)双保险兼容各机型隐藏键盘hideSoftInput(activity)无焦点控件也能收状态感知isSoftInputVisible()判断键盘是否可见高度监听registerSoftInputChangedListener()拿到实时键盘高度点空白收起clickBlankArea2HideSoftInput()内置参考实现代码五、小结软键盘问题看似琐碎却直接影响每一个输入场景的流畅度。KeyboardUtils 把fixAndroidBug5497遮挡、fixSoftInputLeaks泄漏、可靠的显示/隐藏、状态与高度监听等能力收拢进一个类让新手也能一行代码解决 6 大痛点。想要完整体验可直接运行项目中的 Demo 页面feature/utilcode 目录或阅读 lib/utilcode/README.md 中的 About Keyboard 章节获取全部 API 说明。【免费下载链接】AndroidUtilCode:fire: Android developers should collect the following utils(updating).项目地址: https://gitcode.com/gh_mirrors/an/AndroidUtilCode创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
上一篇/下一篇内容由系统自动关联
返回资讯列表 →