当前位置: 首页 > news >正文

Android 解决键盘遮挡输入框

本文目录 点击直达

  • Android 解决键盘遮挡输入框
    • 代码实现
    • 使用
      • 注意
  • 最后我还有一句话要说
      • 梧桐叶上三更雨,叶叶声声是别离。

Android 解决键盘遮挡输入框

在安卓中通常可以通过添加android:windowSoftInputMode="adjustResize|stateHidden"的方式来让键盘顶起布局,但是如果对状态栏进行过着色隐藏等操作时,这个配置将不会生效,此时输入框输入时键盘仍然不会将布局抬起

经过一番搜索和验证,可以使用AndroidBug5497Workaround来解决问题,但是现今此方案已无法完美适配底部导航栏的情况,所以我基于之前的方案进行了优化

代码实现

将AdjustResizeHelper.kt类Copy进你的项目,需要注意的是这是kotlin语法

import android.annotation.SuppressLint
import android.app.Activity
import android.content.Context
import android.graphics.Rect
import android.os.Build
import android.view.View
import android.view.WindowInsetsobject AdjustResizeHelper {fun supportAdjustResize(activity: Activity) {val decorView = activity.window.decorViewvar usableHeightPrevious = 0if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {decorView.setOnApplyWindowInsetsListener { v, insets ->val usableHeightNow = computeUsableHeight(decorView)if (usableHeightPrevious == usableHeightNow) {return@setOnApplyWindowInsetsListener insets}usableHeightPrevious = usableHeightNowval imeInsets = insets.getInsets(WindowInsets.Type.ime())val navigationBars = insets.getInsets(WindowInsets.Type.navigationBars())val keyboardHeight = imeInsets.bottom - navigationBars.bottomif (keyboardHeight > 0) {decorView.setPadding(0, 0, 0, keyboardHeight)} else {decorView.setPadding(0, 0, 0, 0)}v.onApplyWindowInsets(insets)}} else {decorView.viewTreeObserver.addOnGlobalLayoutListener {val usableHeightNow = computeUsableHeight(decorView)if (usableHeightPrevious == usableHeightNow) {return@addOnGlobalLayoutListener}usableHeightPrevious = usableHeightNowval rect = Rect()decorView.getWindowVisibleDisplayFrame(rect)val screenHeight = decorView.heightval heightDifference = screenHeight - rect.bottom - getNavigationBarHeight(activity)if (heightDifference > 100) { // 软键盘弹出decorView.setPadding(0, 0, 0, heightDifference)} else { // 软键盘隐藏decorView.setPadding(0, 0, 0, 0)}}}}@SuppressLint("InternalInsetResource")fun getNavigationBarHeight(context: Context): Int {val resources = context.resourcesval resourceId = resources.getIdentifier("navigation_bar_height","dimen","android")return if (resourceId > 0) {resources.getDimensionPixelSize(resourceId)} else 0}private fun computeUsableHeight(view: View): Int {val r = Rect()view.getWindowVisibleDisplayFrame(r)return (r.bottom - r.top)}
}

使用

使用起来很简单,先在Activity的配置中添加android:windowSoftInputMode="adjustResize|stateHidden",然后如下图在Activity的onCreate回调中添加此功能即可
在这里插入图片描述

注意

因为使用通话的双通道麦克风实现了降噪,所以使用时可能声音较小,如果没有声音,请将声音调到最大,然后凑近麦克风吼两句"感谢博主,我会一键三连的"

最后我还有一句话要说

梧桐叶上三更雨,叶叶声声是别离。

周紫芝《鹧鸪天·一点残红欲尽时》

http://www.dtcms.com/a/304552.html

相关文章:

  • 2.2.23-2.2.24规划采购管理-定制项目管理计划
  • C++算法学习专题:哈希算法
  • 预装Windows 11系统的新电脑怎么跳过联网验机
  • AI峰-关于AI的意识-AI浪潮下
  • 【高等数学】第七章 微分方程——第三节 齐次方程
  • 代码随想录——数组——移除元素——双指针
  • openeuler24.03部署k8s1.32.7高可用集群(三主三从)
  • 《Spring Cloud Config配置中心核心原理与动态刷新方案》
  • Singapore
  • 聚观早报 | 三星获特斯拉AI芯片订单;小米16首发成安卓最强SOC;iPhone 17 Pro支持8倍光学变焦
  • Kubernetes 核心准备:从 Pod 本质到网络模型全解析
  • 作物生长模型Oryza V3实战16:气象数据集
  • 个人健康管理小程序(消息订阅、Echarts图形化分析)
  • 如何调整服务器的内核参数?-哈尔滨云前沿
  • 随着人工智能技术的飞速发展,大语言模型(Large Language Models, LLMs)已经成为当前AI领域最引人注目的技术突破。
  • Apache Ignite Cluster Groups的介绍
  • 多目标粒子群优化(MOPSO)解决ZDT1问题
  • 嵌入式系统分层开发:架构模式与工程实践(一)
  • Spring Boot 2整合MyBatis Plus详细指南
  • 【面试场景题】阿里云子账号设计
  • 从零开始学习Dify-爬取网站文章,批量提取和输出热点摘要(十)
  • CRMEB电商系统集群部署指南:阿里云COS静态文件加速与资源分离最佳实践
  • 聊聊测试环境不稳定如何应对
  • 人工智能与法律:智能司法的创新与挑战
  • C++ 进阶
  • Typecho handsome新增评论区QQ,抖音,b站等表情包
  • 【Clumsy】只是学习记录
  • 晶界能计算
  • flexiblejs + pxtorem 实现浏览器缩放适配:兼顾系统缩放与文本放大体验
  • 图形界面应用程序技术栈大全