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.pswp.cn/pingmian/91077.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/91077.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

热门JavaScript库“is“等软件包遭npm供应链攻击植入后门

轻量级 JavaScript 实用工具库 "is" 是 NPM 平台上的热门项目,每周下载量超过 220 万次。然而在 2025 年 7 月 19 日,该库开发者遭遇钓鱼攻击导致账户凭证泄露,攻击者借此发布了包含远程代码执行后门的恶意版本。钓鱼攻击入侵开发者…

如何实现缓存音频功能(App端详解)

本方案提供了符合平台规范的音频缓存实现,通过分层设计确保功能可靠性,同时预留扩展点支持未来优化需求。📦 音频缓存与播放流程说明 项目目标 实现App端音频资源的自动缓存与播放: 获取远程音频URL下载文件至本地_downloads/目录…

从零到一:Django图书管理系统完整开发实战指南

作者:笙囧同学 身份:中科院计算机大模型方向硕士 | 全栈开发爱好者 座右铭:偷懒是人生进步的阶梯 联系方式:3251736703qq.com 可接课设,论文,专利辅导 全平台账号:笙囧同学 📖 前言 …

硬件电路设计(基本元器件)

一、电阻 1.电阻的基本概念 电阻是导体对电流阻碍作用的物理量,符号为R,单位为欧姆(Ω)。电阻的大小由导体的材料、长度、横截面积和温度共同决定。 电阻公式 导体的电阻R可通过以下公式计算: ρ:电阻率&…

R语言常用扩展包

R语言的强大之处很大程度上源于其丰富的扩展包(Packages)生态系统,目前CRAN( Comprehensive R Archive Network)上托管的扩展包已超过20,000个。以下是不同领域最常用的核心扩展包分类介绍: 一、数据处理与…

文件相关问题(AI回答)

一个进程打开一个文件,另一个进程能删除这个文件吗DeepSeek-R1 回答完成深度思考完成 用时10秒是的,‌另一个进程可以删除一个已被打开的文件‌,但具体行为取决于操作系统和文件系统。以下是关键细节:1. ‌Linux/Unix 的行为‌‌删…

三相四桥臂SVPWM控制及电机模型

三相四桥臂SVPWM控制策略及其在电机驱动中应用 一、三相四桥臂逆变器拓扑特性 1. 结构优势 中性点控制:第四桥臂独立调节中性点电压,支持不平衡负载电压利用率:相比传统三桥臂提升15.47%,最大线电压达U_{dc}硬件简化:无…

deepseek+飞书多维表格 打造小红书矩阵

通过AI技术平台DeepSeek的数据分析与内容生成能力,结合飞书多维表格的智能化协作管理,实现小红书矩阵账号的高效运营。DeepSeek精准抓取热点趋势并生成爆款文案,飞书多维表格则提供可视化内容排期、多账号数据看板及团队任务分配功能&#xf…

4、如何生成分布式ID?

目录 1、分布式ID介绍 什么是 ID? 什么是分布式 ID? 分布式 ID 需要满足哪些要求? 2、分布式 ID 常见解决方案 1、数据库 示例使用2: 2、数据库号段模式 使用示例2: 一、核心设计思路 二、实现代码 1. 数据库表设计&…

Rust 实战三 | HTTP 服务开发及 Web 框架推荐

往期回顾 Rust 实战二 | 开发简易版命令行工具 grepRust 实战一 | 用 RustRover 开发猜数字游戏Rust 安装与版本更新 代码开源地址:https://github.com/0604hx/rust-journey 🚀 Web 框架 名称性能(QPS)WebSocket / SSEGitHub ⭐…

墨者:SQL过滤字符后手工注入漏洞测试(第1题)

1. 墨者学院:SQL过滤字符后手工注入漏洞测试(第1题)🚀 2. 漏洞背景与测试思路🔍 在Web安全测试中,当遇到对输入字符有过滤的SQL注入漏洞时,我们需要使用特殊技巧绕过过滤机制。本次测试的目标URL存在字符过滤&#xff…

深入解析 Vue 3 中 v-model 与表单元素的绑定机制

v-model 是 Vue 中最强大的指令之一,它简化了表单数据双向绑定的实现。本文将系统梳理各种 HTML 表单元素与 v-model 的绑定关系,特别是那些容易引起困惑的类型。一、v-model 的本质v-model 是一个语法糖,它实际上是 :value 和 input 的组合&…

【赵渝强老师】MySQL中的数据库对象

MySQL数据库中包含各自数据库对象,常见的数据库对象有:表、索引、视图、事件、存储过程和存储函数等等。 视频讲解如下 【赵渝强老师】MySQL中的数据库对象一、 创建与管理表 表是一种非常重要的数据库对象,MySQL数据库的数据都是存储在表中…

Angular面试题目和答案大全

基础概念篇1. 什么是Angular?它与AngularJS有什么区别?答案: Angular是由Google开发的基于TypeScript的开源Web应用框架,用于构建单页应用程序(SPA)。Angular vs AngularJS对比:特性AngularJSAn…

CSS 语音参考

CSS 语音参考 概述 CSS(层叠样式表)是用于描述HTML或XML文档样式的样式表语言。它为网页元素提供了一种统一的方式来定义字体、颜色、布局和其他视觉属性。CSS语音参考旨在为开发者提供一个详尽的指南,以便他们能够更有效地使用CSS来增强网页…

C# WPF 实现读取文件夹中的PDF并显示其页数

文章目录技术选型第一步:创建项目并安装依赖库第二步:定义数据模型 (Model)第三步:创建视图模型 (ViewModel)第四步:设计用户界面 (View)总结与解释后记关于转换器的错误工作中需要整理一些PDF格式文件,程序员的存在就…

设计模式(五)创建型:原型模式详解

设计模式(五)创建型:原型模式详解原型模式(Prototype Pattern)是 GoF 23 种设计模式中的创建型模式之一,其核心价值在于通过复制现有对象来创建新对象,而不是通过 new 关键字调用构造函数。它特…

K8S 八 数据存储-高级存储PV PVC 生命周期;配置存储ConfigMap Secret

目录数据存储 Volume8.1 基本存储8.1.1 EmptyDir8.1.2 HostPath 挂载目录8.1.3 NFSnfs的服务8.2 高级存储8.2.1 PV和PVC8.2.2 PV 持久化卷申请8.2.3 PVC 资源申请PVC的配置参数8.2.4 生命周期配置存储8.3.1 ConfigMap8.3.2 Secret数据存储 Volume Kubernetes的Volume支持多种类…

Baumer工业相机堡盟工业相机如何通过YoloV8深度学习模型实现轮船检测识别(C#代码UI界面版)

Baumer工业相机堡盟工业相机如何通过YoloV8深度学习模型实现轮船检测识别(C#代码UI界面版)工业相机使用YoloV8模型实现轮船检测识别工业相机通过YoloV8模型实现轮船检测识别的技术背景在相机SDK中获取图像转换图像的代码分析工业相机图像转换Bitmap图像格…

自习室预约小程序的设计与实现

自习室预约小程序的设计与实现现代学习环境对高效、便捷的预约系统需求日益增长。自习室预约小程序结合前沿技术栈,提供流畅的用户体验和强大的后台管理功能,满足学生、职场人士等群体的自习需求。技术架构与核心功能Vue.js 构建动态前端界面 采用 Vue.j…