沉浸式webview输入框被输入法遮挡了怎么办?!

还是那个倒霉的双十一需求,测试时发现发弹幕的输入框被系统输入法挡住了,这个问题在之前UC内核的浏览器时没问题啊。经过各种对比定位,发现是因为这次需求还有个沉浸式的实现,就是这个实现导致输入框无法被弹起。所幸看到了AndroidBug5497Workaround (用我这个就够了)这篇blog,试验后效果拔群,唯独有个小遗憾是没有适配非沉浸式的状态,沉浸式和非沉浸式切换时会有个小黑条。小子不才遂在大神肩膀上狗尾续貂,以资来者。

原理

网传这是个Android固有的bug,具体原理我也没搞明白了,秉着又不是不能用的原则,先把问题解决了。

这个实现主要就是在键盘出现和消失的时候计算键盘、状态栏以及导航栏的高度,以便确定页面太高的大小。我的小调整就是增加一个沉浸式状态的传递,如果是沉浸式则需要少减一个状态栏的高度,仅此而已。

实现

Java代码
public class AndroidBug5497Workaround {// For more information, see https://issuetracker.google.com/issues/36911528// To use this class, simply invoke assistActivity() on an Activity that already has its// content view set.public static void assistActivity(Activity activity, boolean isImmersive) {new AndroidBug5497Workaround(activity, isImmersive);}private View mChildOfContent;private int usableHeightPrevious;private FrameLayout.LayoutParams frameLayoutParams;private boolean isImmersive;private AndroidBug5497Workaround(Activity activity, boolean isImmersive) {FrameLayout content = (FrameLayout) activity.findViewById(android.R.id.content);mChildOfContent = content.getChildAt(0);mChildOfContent.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {public void onGlobalLayout() {possiblyResizeChildOfContent();}});frameLayoutParams = (FrameLayout.LayoutParams) mChildOfContent.getLayoutParams();this.isImmersive = isImmersive;}private int frameLayoutHeight = 0;private void possiblyResizeChildOfContent() {int usableHeightNow = computeUsableHeight();if (usableHeightNow != usableHeightPrevious) {int usableHeightSansKeyboard = mChildOfContent.getRootView().getHeight();int heightDifference = usableHeightSansKeyboard - usableHeightNow;if (heightDifference > (usableHeightSansKeyboard / 4)) {// keyboard probably just became visibleframeLayoutHeight = frameLayoutParams.height;// !!!修改前保存原有高度// 是否沉浸式,增减状态栏高度int statusBarHeight = isImmersive && BarUtil.isSupportFitsSystem() ?BarUtils.getStatusBarHeight() : 0;frameLayoutParams.height = usableHeightSansKeyboard - heightDifference + statusBarHeight;} else {// keyboard probably just became hiddenif (0 != frameLayoutHeight) {frameLayoutParams.height = frameLayoutHeight;// !!!收起键盘恢复原有高度}}mChildOfContent.requestLayout();usableHeightPrevious = usableHeightNow;}}private int computeUsableHeight() {Rect r = new Rect();mChildOfContent.getWindowVisibleDisplayFrame(r);return (r.bottom - r.top);}
}

在初始化webview的onCreate()方法中增加一句即可

AndroidBug5497Workaround.assistActivity(this, isImmersive);

参考

AndroidBug5497Workaround (用我这个就够了)

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

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

相关文章

c++字符串拼接(对标C语言的sprintf)

C语言的sprintf 我们在一些场景下需要先将字符串拼接起来再使用。 如: 我们要输出一个数组中的数据,输出的格式为--第几个数据为什么? 在这种情况下每次输出的字符串都是不一样的,我们可以通过循环来不断增加i的值,通…

“华为杯“第四届中国研究生数学建模竞赛-D题:邮路规划与邮车调度

目录 摘 要: 1.问题的重述 2.模型的假设与符号说明 2.1 针对本问题,本文做出如下假设 2.2 符号说明 3.问题的数学模型 4.问题的求解 4.1 问题一的求解 4.1.1 最少邮车数的求法 4.1.2 邮路规划及路径选择 4.1.3 问题的求解结果 4.2 问题二的求…

隧道应用3-Cobalt Strike正反向连接多层内网

Cobalt Strike 正向连接多层内网: teamserver 不允许访问 B ,但是服务器上A有权限( A 与 B 在同一网段),若 A 服务上已经有了 cs 的后门,则可以通过 cs 的正向连接去连接 B ,在 teamserver 通…

Java 怎么判断对象是否可以被回收?

Java 怎么判断对象是否可以被回收? 在 Java 中,对象的垃圾回收是由垃圾回收器(Garbage Collector)负责的。判断对象是否可以被回收通常是通过对象的引用计数、可达性分析等机制来完成的。以下是一些判断对象是否可以被回收的方法…

datavrap可视化设计器使用手册

datavrap使用手册 一、产品简介 datavrap是一个动态数据可视化设计器,通过简单配置生成可视化视频,图片和gif。 站长:B站UP,夹克mnnm 这个产品的灵感是在做B站视频时,觉得每次通过修改代码录屏实现视频制作太过于繁琐&…

基于Matlab/Simulink的MIL仿真验证解决方案

文章目录 需求追溯 虚拟环境 模型检查 仿真验证 测试报告 参考文献 针对模型开发阶段的ECU算法,可以很直接地将其与虚拟车辆模型连接起来,通过MIL对其进行验证和确认。可以在开发过程的早期检测到设计错误和不正确的需求,也有助于安全地…

浅析爱泼斯坦事件 —— 弱电控制强电原理

据网络文字与视频资料,爱泼斯坦事件是犹太精英阶层,为了掌控美国国家机器为犹太利益集团服务,而精心设下的一个局。本文先假设这个结论成立,并基于此展开讨论。 我们知道,弱电管理强电是电气工程中的一门专门学问&…

SouthernBiotech抗荧光淬灭封片剂

荧光淬灭又称荧光熄灭或萃灭,是指导致特定物质的荧光强度和寿命减少的所有现象。引起荧光淬灭的物质称为荧光淬灭剂。SouthernBiotech专门开发的Fluoromount-G系列荧光封片剂是以甘油为基础,加入抗荧光淬灭剂,可明显降低荧光淬灭现象&#xf…

【工具】tmux简单用法

tmux 是一个终端复用工具,允许你在单个终端窗口中运行多个终端会话,并在它们之间切换。它提供了分割窗格、多窗口和会话管理等功能,使得在终端中更加高效地工作。 以下是一些 tmux 的基本概念和简单应用: 会话 (Session): 一个 t…

天津python培训学校 Python有怎样的前景?

很多人以为Python之所以变得火热的原因是人工智能和大数据的兴起,这并非是全部的原因,Python是一门很适合人工智能领域的编程语言,人工智能目前虽然还处于前期阶段,但是对人工智能方面的人才确在不断增加,能够提供的岗…

mysql数据库优化

数据库的性能调优和优化是指通过优化数据库结构、SQL语句的编写以及服务器硬件和操作系统等方面的配置,来提高数据库的响应速度和稳定性,以满足业务需求。 结合实际需求,从以下四个方面进行讲解。 一、数据库设计优化 二、SQL语句优化 三、…

为什么很多公司选择不升级JDK版本,仍然使用JDK8?

在讨论为什么许多公司选择不升级JDK版本,而继续使用JDK 8时,我们需要从多个角度来分析这个问题。以下是根据您提供的背景信息进行的一些分析和真实案例。 本文已收录于,我的技术网站 ddkk.com,有大厂完整面经,工作技术…

[易语言]易语言调用C++ DLL回调函数

易语言适合用于数据展示,数据的获取还是VC来的快、方便哈。 因此我一般使用VC编写DLL,使用易语言编写界面,同一个程序,DLL和EXE通讯最方便的就是使用接口回调了。 废话少说,进入主题。 1. VC编写DLL 为了DLL能够调…

软件测试作业‖若依系统的自动化+性能

以若依系统或者任意系统作为案例,题目:以某一 web系统为测试对象,完成以下文档的编写: (1)产品规格说明书(SPEC) 要求:功能完整(完成产品需求70%以上)、UI优良(每个页 面均有字段约束和合理的出错提示)、流程完整(一一对应功能)、流程合理(处理逻辑非…

用python实现删除照片中的物体

要使用Python删除照片中的物体,你可以使用图像处理库,如OpenCV和PIL(Python Imaging Library)。以下是一个简单的示例,演示如何使用OpenCV和PIL删除照片中的特定物体。 首先,确保你已经安装了OpenCV和PIL库…

C //练习 5-16 增加选项-d(代表目录顺序)。该选项表明,只对字母、数字和空格进行比较。要保证该选项可以和-f组合在一起使用。

C程序设计语言 (第二版) 练习 5-16 练习 5-16 增加选项-d(代表目录顺序)。该选项表明,只对字母、数字和空格进行比较。要保证该选项可以和-f组合在一起使用。 注意:代码在win32控制台运行,在不…

什么类型的企业需要工单系统?适用场景与优势分析

在现代商业中,必须高效地管理与跟踪大量任务和工作流程。对一些企业而言,处理很多订单是一项具有挑战性的任务。此订单可能来自客户需求、内部问题反馈或各种业务流程中的任务分配。可是,如果没有好的解决方法,这类订单可能会致使…

电影《北国红豆》剧情简介

该片由北京电影制片厂拍摄,王好为执导,刘晓庆,于绍康,金鑫,张国民等主演,1984年上映。 农村姑娘鲁雪枝远离家乡,投奔到大兴安岭的姐姐家落户。她经过刻苦学习,于林业中学毕业后&…

抖音矩阵云混剪系统源码多平台多账号一站式管理(免授权版)

抖音矩阵云混剪系统源码 短视频矩阵营销系统V2.2.1(免授权版) 中网智达矩阵营销系统多平台多账号一站式管理,一键发布作品。智能标题,关键词优化,排名查询,混剪生成原创视频,账号分组,意向客户自动采集,智能回复,多账号评论聚合回复,免切换,免登陆发布….助力您在…

Flutter开发进阶之动画

Flutter开发进阶之动画 在Flutter中,动画是至关重要的一个部分,它能够为应用程序提供更加丰富和生动的用户体验,Flutter中的动画系统是UI框架的核心功能之一,也是开发者学习Flutter框架的重要部分,由于动画原理在所有…