Android监听软键盘弹出与隐藏的两种方法

发布时间 - 2026-01-11 00:44:41    点击率:

需求:

现在有一个需求是点击一行文本框,弹出一个之前隐藏的输入框,输入完成后按返回键或者其他的东西隐藏键盘和输入框,将输入框的内容填充到文本框中。

实现:

拿到这个需求的第一反应就是写一个监听来监听键盘的显示和隐藏来控制输入框的显示和隐藏,控制文本框中的内容。
所以我做了如下操作:

  1. 指定android:windowSoftInputMode="adjustResize|stateAlwaysHidden"这个的做法是为了让键盘弹出时改变布局。
  2. 让Activity实现LayoutchangeListener,监听布局的改变,当布局发生的改变为屏幕的1/3时我们认为是键盘导致的。
@Override 
 public void onLayoutChange(View v, int left, int top, int right, 
     int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { 

   //old是改变前的左上右下坐标点值,没有old的是改变后的左上右下坐标点值 

   //现在认为只要控件将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(); 

   } 

 }

问题:

没错,这样确实是能够做到监听软键盘的弹出和隐藏,这一切都是因为之前设置了indowSoftInputMode=adjustResize,但是当全屏模式下是这个属性是无效的,键盘弹出和隐藏并不会触发onLayouChangeListener。

而项目中使用了SystemBarTintManager之后,Activity就变成了全屏模式所以我做了如下操作

//contentlayout是最外层布局
mChildOfContent = contentlayout.getChildAt(0);
mChildOfContent.getViewTreeObserver()
.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {  
   public void onGlobalLayout() {    
       possiblyResizeChildOfContent();  
}});

private void possiblyResizeChildOfContent() {  
int usableHeightNow = computeUsableHeight();  
if (usableHeightNow != usableHeightPrevious) {    
   int usableHeightSansKeyboard = mChildOfContent.getRootView().getHeight();    
   int heightDifference = usableHeightSansKeyboard - usableHeightNow;    
   if (heightDifference > (usableHeightSansKeyboard / 4)) {      
   // 键盘弹出    
   } else {      
   // 键盘收起      
   productInfo.setVisibility(View.GONE);      
   productInfoEnd.setText(productInfo.getText().toString());    
}    
   mChildOfContent.requestLayout();    
    usableHeightPrevious = usableHeightNow;  
}
}
private int computeUsableHeight() {  
 Rect r = new Rect();  
mChildOfContent.getWindowVisibleDisplayFrame(r);  
return (r.bottom - r.top);}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# 安卓监听软键盘弹出  # 安卓  # 监听软键盘隐藏  # android  # 软键盘监听  # Android中监听软键盘显示状态实现代码  # android监听软键盘的弹出与隐藏的示例代码  # Android项目类似淘宝 电商 搜索功能  # 监听软键盘搜索事件  # 延迟自动搜索  # 以及时间排序的搜索历史记录的实现  # Android App实现监听软键盘按键的三种方式  # Android 监听软键盘状态的实例详解  # Android监听键盘状态获取键盘高度的实现方法  # 弹出  # 输入框  # 全屏  # 框中  # 的是  # 都是  # 其他的  # 坐标点  # 这一切  # 我做了  # 大家多多  # 文本框  # 有一个  # 是为了  # 变成了  # 使用了  # 完成后  # 最外层  # 超过了  # 模式下 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: uc浏览器二维码扫描入口_uc浏览器扫码功能使用地址  Win11怎么更改系统语言为中文_Windows11安装语言包并设为显示语言  Laravel如何实现邮件验证激活账户_Laravel内置MustVerifyEmail接口配置【步骤】  网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?  制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?  Laravel如何使用Eloquent ORM进行数据库操作?(CRUD示例)  使用PHP下载CSS文件中的所有图片【几行代码即可实现】  googleplay官方入口在哪里_Google Play官方商店快速入口指南  简单实现jsp分页  ChatGPT常用指令模板大全 新手快速上手的万能Prompt合集  Android中Textview和图片同行显示(文字超出用省略号,图片自动靠右边)  悟空识字如何进行跟读录音_悟空识字开启麦克风权限与录音  用yum安装MySQLdb模块的步骤方法  网站图片在线制作软件,怎么在图片上做链接?  DeepSeek是免费使用的吗 DeepSeek收费模式与Pro版本功能详解  EditPlus中的正则表达式 实战(4)  Python面向对象测试方法_mock解析【教程】  js实现点击每个li节点,都弹出其文本值及修改  Laravel如何自定义分页视图?(Pagination示例)  JS中页面与页面之间超链接跳转中文乱码问题的解决办法  Laravel如何使用Passport实现OAuth2?(完整配置步骤)  品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?  标题:Vue + Vuex 项目中正确使用 JWT 进行身份认证的实践指南  香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南  logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?  EditPlus中的正则表达式 实战(1)  北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?  Android Socket接口实现即时通讯实例代码  如何在云主机上快速搭建网站?  网页制作模板网站推荐,网页设计海报之类的素材哪里好?  Laravel如何设置定时任务(Cron Job)_Laravel调度器与任务计划配置  HTML5空格和nbsp有啥关系_nbsp的作用及使用场景【说明】  Mybatis 中的insertOrUpdate操作  Laravel如何实现全文搜索功能?(Scout和Algolia示例)  php打包exe后无法访问网络共享_共享权限设置方法【教程】  iOS UIView常见属性方法小结  如何续费美橙建站之星域名及服务?  如何用AI一键生成爆款短视频文案?小红书AI文案写作指令【教程】  google浏览器怎么清理缓存_谷歌浏览器清除缓存加速详细步骤  JS碰撞运动实现方法详解  PythonWeb开发入门教程_Flask快速构建Web应用  香港服务器选型指南:免备案配置与高效建站方案解析  高防服务器租用指南:配置选择与快速部署攻略  Linux虚拟化技术教程_KVMQEMU虚拟机安装与调优  🚀拖拽式CMS建站能否实现高效与个性化并存?  Laravel怎么配置S3云存储驱动_Laravel集成阿里云OSS或AWS S3存储桶【教程】  Laravel Asset编译怎么配置_Laravel Vite前端构建工具使用  laravel怎么通过契约(Contracts)编程_laravel契约(Contracts)编程方法  如何在万网自助建站平台快速创建网站?  网站制作价目表怎么做,珍爱网婚介费用多少?