如何清除webview138、139版本软键盘占用的区域

好的,这个问题非常具体且关键。在 Android System WebView 的 138 和 139 版本(基于 Chromium 113)的上下文中,“清除软键盘占用的区域”通常意味着:在软键盘收起后,WebView 的布局或视口没有正确恢复,留下了一片空白区域(就像键盘仍然在那里一样)。

这个问题通常不是由用户主动“清除”的,而是开发者需要预防编程解决的。以下是这个问题的原因和完整的解决方案。

问题根源

这个问题通常由以下原因引起:

  1. JavaScript 监听错误: 网页使用 window.onresize 来检测键盘状态,但在某些复杂交互下(特别是混合应用或快速切换焦点时),这个事件可能不可靠。
  2. 视口恢复失败: 这是一个经典的 Chromium Bug。在键盘收起后,WebView 的布局视口(Layout Viewport)或可视视口(Visual Viewport)的高度没有正确重置,导致 100vh 的区域仍然计算了键盘的高度。
  3. 第三方库或框架冲突: 某些用于处理键盘或输入的 JavaScript 库可能会干扰 WebView 默认的恢复行为。

解决方案

解决方案分为对开发者对终端用户两种。


一、 给开发者的解决方案(治本)

如果你的网页或 Hybrid App 出现了此问题,你需要通过代码来修复。

方案 1:使用现代 CSS - 首选方案

这是最推荐、最根本的解决方案。使用 CSS 动态视口单位 来代替传统的 vh

  • height: 100vh 替换为 height: 100dvh

    • dvh(Dynamic Viewport Height)是专门为此场景设计的单位。它会自动排除正在显示的 UI(如软键盘)所占用的区域。
    • 在键盘弹出时,100dvh 的高度就是屏幕高度减去键盘高度。
    • 在键盘收起时,100dvh 会自动恢复为整个屏幕高度。

    示例:

    /* 旧的、有问题的代码 */
    .my-container {height: 100vh;
    }/* 新的、修复后的代码 */
    .my-container {height: 100dvh;
    }
    

    兼容性: 138+ 版本的 WebView(Chromium 113+)对此有良好的支持。对于更老的浏览器,可以考虑使用 @supports 进行回退。

    .my-container {height: 100vh; /* 回退方案 */height: 100dvh; /* 现代浏览器使用 */
    }
    
方案 2:使用可靠的 JavaScript API 强制滚动复位

如果 CSS 方案无法完全解决,或者你需要更精确的控制,可以使用 visualViewport API。

  • 监听键盘收起事件并手动将页面滚动到一个合适的位置。

    示例代码:

    let isKeyboardShown = false;// 监听可视视口的变化(这是检测键盘最可靠的方式)
    window.visualViewport.addEventListener('resize', () => {// 如果可视视口高度变大,说明键盘很可能收起了if (window.visualViewport.height > previousHeight) {isKeyboardShown = false;// 关键修复:强制滚动到当前焦点元素或页面顶部// 有时需要一个小小的延时来确保布局已更新setTimeout(() => {// 方法1: 滚动到顶部window.scrollTo(0, 0);// 方法2: 如果知道特定元素,可以滚动到该元素// const activeElement = document.activeElement;// if (activeElement && activeElement.scrollIntoView) {//    activeElement.scrollIntoView({block: 'nearest'});// }}, 50);} else {isKeyboardShown = true;}
    });// 监听输入框失焦事件也是一个很好的触发时机
    document.addEventListener('focusout', () => {setTimeout(() => {// 再次检查是否还有活跃的输入框,如果没有,则可能是键盘收起了if (document.activeElement.tagName === 'BODY') {window.scrollTo(0, 0);}}, 100);
    });
    

二、 给终端用户的临时解决方法(治标)

如果用户遇到了这个问题,但无法等待开发者更新应用或网页,可以尝试以下临时性的解决方法:

  1. 重启 WebView 进程

    • 完全关闭出现问题的 App(从最近任务列表中划掉)。
    • 重新打开 App。这是最有效且最简单的临时解决方案。
  2. 切换输入法

    • 有时特定输入法(如第三方输入法)与 WebView 的交互存在 Bug。尝试切换到系统自带的默认输入法(如 Gboard)。
  3. 旋转屏幕

    • 将手机从竖屏旋转到横屏,再转回竖屏。这个操作会强制 WebView 重新计算布局,通常可以清除占用的区域。
  4. 清除 WebView 数据(较麻烦):

    • 打开手机 设置 -> 应用 -> Android System WebView
    • 进入 存储 -> 清除缓存清除数据
    • 注意: 这可能会重置某些网页的登录状态和偏好设置。
  5. 更新或回滚 WebView

    • 前往 Google Play 商店,搜索 Android System WebView,确保它是最新版本。谷歌可能在后续版本中修复了此问题。
    • 如果问题是在更新后出现的,可以尝试 卸载更新(在 WebView 的应用信息页面中有此选项),回退到系统自带的稳定版本。

总结

角色解决方案说明
开发者使用 height: 100dvh根本解决方案,符合现代 Web 标准。
开发者使用 visualViewport API 手动控制编程解决方案,用于复杂场景。
用户重启 App最有效的临时方法,强制重置 WebView 状态。
用户旋转屏幕/切换输入法快速触发布局刷新的小技巧。

对于开发者来说,拥抱 dvh 等现代 CSS 单位是预防和解决此类布局问题的最佳实践。而 138 和 139 版本的 WebView 已经为这些新特性提供了稳定的支持。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/920213.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/920213.shtml

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

相关文章

深度学习:卷积神经网络(CNN)

文章目录一、CNN 基础认知1.1 图像在计算机中的存储形式1.2 图像识别的核心需求:画面不变性1.3 传统神经网络的局限二、CNN 核心原理:三大核心层与关键操作2.1 卷积层(1)什么是卷积操作?(2)卷积…

iOS 26 正式版即将发布,Flutter 完成全新 devicectl + lldb 的 Debug JIT 运行支持

在之前的 《Flutter 又双叒叕可以在 iOS 26 的真机上 hotload》 和 《Flutter 在 iOS 真机 Debug 运行出现 Timed out *** to update》 我们聊过,由于 iOS 26 开始,Apple 正式禁止了 Debug 时 mprotect 的 RX 权限,导致了 Flutter 在 Debug 运…

机器学习全流程拆解 _ 从数据到模型的科学之道

-—— 避开80%项目失败的隐形成本,掌握高效建模方法论*📌 一、明确目标:成败的起点 1. 问题定位 分类任务:区分二分类/多分类/多标签分类预测任务:标量预测(如房价)vs 向量预测(如股…

Android 广告轮播全实现:图片与视频混合展示的完整方案

广告轮播是移动应用中提升用户转化率的核心组件,尤其在电商、资讯类应用中应用广泛。传统轮播仅支持图片展示,而现代应用需要兼顾图片和视频内容以增强吸引力。本文将详细讲解如何实现一个支持图片与视频混合播放的高性能广告轮播,涵盖布局设…

AI大模型企业落地指南-笔记01

前言AI技术的发展趋势必然是越来越普及,越来越“技术平权”的。在未来10年内,AI将以各种方式“融入”人类世界,与人类乃至世界深度融合。一. 概念第1章 AI与大模型概述1.1 什么是AI人工智能(全称Artificial Intelligence&#xff…

Linux-孤儿进程和僵死进程

文章目录孤儿进程概述僵死进程概述孤儿进程 概述 父进程运行结束,子进程还在运行,此时,子进程就成了孤儿进程(Orphan Process)每当出现一个孤儿进程的时候,内核就把孤儿进程的父进程设置为 init &#xf…

【Redis 进阶】----主从复制(重点理解流程和原理)

在分布式系统中为了解决单点问题(某个服务器程序只有一个节点(只搞一个物理服务器来部署这个服务器程序)。可用性不高:如果这个机器挂了意味着服务就中断了;性能 / 支持的并发量比较有限)。通常会把数据复制…

【Redisson】redis最佳实践-RedissonUtils+Caffeine

RedissonUtils - 企业级 Redis 缓存工具库 - 二级缓存 项目地址: hhttps://gitee.com/chen934298133/redisson-utils问题反馈: Issues邮箱: chen934298133163.com 📖 项目简介 RedissonUtils 是一个基于 Redisson 的企业级 Redis 缓存工具库,提供了完…

QT(QTableWidget)

QT6QTableWidget QTableWidget是一种Item Widget组件,它以表格形式和管理数据,表格的每个单元格关联一个QTableWidgetItem对象,可以设置每个单元格的文字内容、字体、文字颜色、背景色、图标等,还可以有复选框。每个单元格还可以存…

Sentinel相关记录

系列文章目录 draft Sentinel 是阿里巴巴开源的 轻量级服务防护组件,主要用于实现以下功能:流量控制FlowRule(Rate Limiting):限制单位时间内的请求量,防止系统过载。 熔断降级DegradeRule(Ci…

2025年渗透测试面试题总结-29(题目+回答)

安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 二百四十一、XSS 设置Http-Only如何绕过 二百四十二、XSS攻击手段分类 二百四十三、高杀软覆盖工作组的渗…

如何用Wireshark捕获当前房间路由器和主机的数据包

一、前期工作 在我的这篇文章中: Wireshark USRP联合波形捕获(上)-CSDN博客 通过192.168.1.103这个主机ip筛选Wireshark捕获的数据包,认为Source和Direction中至少一个包含192.168.1.103才能代表路由器和主机之间的WiFi信号。 …

深度解析游戏引擎中的相机:视图矩阵

在现代游戏引擎中,相机系统是不可或缺的一部分。它决定了玩家在游戏中看到的视角和场景。而视图矩阵作为相机系统的核心组件之一,起到了至关重要的作用。本文将深入探讨视图矩阵的原理、计算方法及其在游戏引擎中的应用。 视图矩阵的基本概念 视图矩阵…

96、23种设计模式之原型模式(5/23)

原型模式(Prototype Pattern)是创建型设计模式的一种,其核心思想是通过复制现有对象(原型)来创建新对象,而非通过构造函数或工厂方法从头构建。该模式将对象的创建过程从构造逻辑转移到复制操作&#xff0c…

【python与生活】如何用Python写一个简单的自动整理文件的脚本?

用 Python 写一个自动整理文件的脚本很简单,核心思路是:按文件后缀(如 .jpg、.pdf)将文件分类,移动到对应的文件夹(如「图片」「文档」)中。以下是一个实用的实现方案,新手也能轻松修…

SELinux相关介绍

目录 1.SELinux 概述 2.SELinux 的执行模式 3.SELinux 的使用 1.SELinux 概述 SELinux( Security Enhanced Linux 安全性增强的Linux),由美国国家安全局 NSA(National Security Agency)开发,构建与 Kernel …

【C语言练习】汉诺塔

一、题目 介绍:汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆…

随机森林实战:在鸢尾花数据集上与决策树和逻辑斯蒂回归进行对比

前言 集成学习通过组合多个模型的优势,常能获得比单一模型更优的性能,随机森林便是其中的典型代表。它基于 Bagging 思想,通过对样本和特征的双重随机采样,构建多棵决策树并综合其结果,在降低过拟合风险的同时&#xf…

(计算机网络)TCP 三握中第三次 ACK 丢失会发生什么?

在 TCP 的三次握手过程中,如果 第三次 ACK 丢失,TCP 是如何保证连接可靠建立的呢?1️⃣ 场景说明第三次 ACK:客户端发送给服务器的 ACK,确认服务器的 SYN-ACK。假设该 ACK 在网络传输过程中丢失。2️⃣ 客户端状态客户…

容智Report Agent2.0重磅发布!重新定义企业数据分析AI时代

在数据成为生产要素之一的今天,很多企业依然面临这样的困境: 想要一份年度财务分析,财务团队可能要忙半个月甚至一个月;想查一个业务指标,要先找出在哪个系统,再申请权限、写SQL、调报表,折腾半…