公司要使用app,所以学习了一下android app的开发。
目的就是把html内容给展示出来而已,使用webview来呈现html内容。
可是,在点击输入框时,软键盘会遮挡输入框的内容。

可是自己无论怎么调都不成功,如果网页放入chrome浏览器中又可以。

去网上找了好多教程,说是android的一个bug,历史还很久远google还不想解决,所以得自己解决。

教程说让加载AndroidBug5497Workaround类,
在webview所在的activity的
onCreate方法里的
setContentView()后调用AndroidBug5497Workaround.assistActivity(this);这个方法。

调用了之后,是可以看见输入框了,但是又出现了一个问题。

因为html太长了,在webview中会滚动,但是调用了AndroidBug5497Workaround.assistActivity(this);这个方法之后不能出现滚动了。

滚动的原因是webview的高度太短,装不下html,所以才出现滚动。
看了这个类,他的功能就是监听键盘弹起回收的事件,通过这两个事件来影响webview的高度。

frameLayoutParams.height = usableHeightSansKeyboard - heightDifference;

这段代码是键盘弹起后设置的webview的高度,具体这个方法是干什么的我不知道,我就知道我的webview的高度会通过这个函数变短。

问题出在变回来的时候的高度上。
frameLayoutParams.height = usableHeightSansKeyboard;
就是上面这个高度,他会变成手机屏幕分辨率的高度Nexus 5X是1920

但是webview没那么高。所以我首先获取了这个webview原始的高度,等软键盘弹回来的时候,设置会webview原始的高度即可。

设置变量用来存储webview的初始高度
private int initheight;

因为初始化我获得的webview的高度为0,所以我直接把下面这段代码仍在监听方法里面
int tempheight=mChildOfContent.getHeight();
if(initheight<tempheight)
{
initheight=tempheight;
}
因为初始化的时候initheight为0,所以一开始监听,mChildOfContent.getHeight();所获得的就是webview的高,设置之后,在软键盘回收的代码中替换为
//frameLayoutParams.height = usableHeightSansKeyboard;
frameLayoutParams.height = initheight;

就大功告成了
修改后的AndroidBug5497Workaround

public class AndroidBug5497Workaround {public static void assistActivity(Activity activity) {new AndroidBug5497Workaround(activity);}private View mChildOfContent;private int usableHeightPrevious;private FrameLayout.LayoutParams frameLayoutParams;private int initheight;private AndroidBug5497Workaround(Activity activity) {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();}private void possiblyResizeChildOfContent() {int tempheight=mChildOfContent.getHeight();if(initheight<tempheight){initheight=tempheight;}int usableHeightNow = computeUsableHeight();if (usableHeightNow != usableHeightPrevious) {int usableHeightSansKeyboard = mChildOfContent.getRootView().getHeight();int heightDifference = usableHeightSansKeyboard - usableHeightNow;if (heightDifference > (usableHeightSansKeyboard/4 )) {frameLayoutParams.height = usableHeightSansKeyboard - heightDifference;} else {frameLayoutParams.height = initheight;}mChildOfContent.requestLayout();usableHeightPrevious = usableHeightNow;}}private int computeUsableHeight() {Rect r = new Rect();mChildOfContent.getWindowVisibleDisplayFrame(r);return (r.bottom-r.top);}}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
                 <link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-7f770a53f2.css" rel="stylesheet"></div>

转自:https://blog.csdn.net/tlxfif/article/details/77977471

AndroidBug5497Workaround 修改相关推荐

  1. android webview监听软键盘弹出和隐藏来修改虚拟导航栏颜色

    最近项目中用到了webview,然后里面有输入框,当我们点击输入框的时候,软键盘挡住了布局,这就尴尬了,并且产品说,只有在软键盘弹出的时候底部的虚拟导航栏为黑色,软键盘隐藏的时候虚拟导航栏应该也隐藏. ...

  2. mysql并发更新数据,多用户并发修改数据解决方案。

    mysql并发更新数据,多用户并发修改数据解决方案. 在系统中,有一些如余额.资产.积分的数据,是要保证数据一致性的.如,一个人使用两个设备同时进行消费操作,如何保证数据一致性的问题. 我们一起来思考 ...

  3. 设置select下拉框不可修改的→“四”←种方法

    设置select下拉框为不可修改的几种方法: 因为select的特殊性,导致它不能像input表单一样简单地设置一个readonly来限制修改,所以,我们需要进行别的操作! 1.为下拉框添加样式,可以 ...

  4. 将页面元素置为不可修改Readonly,所有元素统一修改,统一调用

    使用JS方法,实现任何形式的元素的不可修改操作 <script language="javascript"> /**将所有元素置为不可修改 **/ function r ...

  5. Myeclipse中修改项目默认编码还是乱码?一步永久解决!

    在myeclipse中修改默认编码后发现项目还是乱码? 点击Windows选择Preferences 如下图

  6. linux修改mysql密码sa_如何修改SA口令,数据库SA密码怎么改?

    [问题现象]安装数据库的时候设置过SA口令,安装后不记得了?有没有办法可以修改数据库SA口令? [原因分析]各版本数据库更改SA口令的方法不一样,一般MSDE2000数据库安装时没有SA口令,SQL ...

  7. mysql修改校对集_MySQL 教程之校对集问题

    本篇文章主要给大家介绍mysql中的校对集问题,希望对需要的朋友有所帮助! 推荐参考教程:<mysql教程> 校对集问题 校对集,其实就是数据的比较方式. 校对集,共有三种,分别为:_bi ...

  8. ubuntu 修改时区、时间、同步网络时间、将时间写入硬件

    查看系统当前的时间状态 $ timedatectl statusLocal time: 六 2021-10-30 09:33:37 CSTUniversal time: 六 2021-10-30 01 ...

  9. 数据结构(03)— 数据处理基本操作(数据的查找、新增、删除、修改)

    我们先来看一个关于查找的例子.查找,就是从复杂的数据结构中,找到满足某个条件的元素.通常可从以下两个方面来对数据进行查找操作:​ 根据元素的位置或索引来查找: 根据元素的数值特征来查找. 针对上述两种 ...

最新文章

  1. 简单时间复杂度大O记法
  2. MyBatis——@Result注解column参数传递——父查询函数的参数传递到子查询
  3. C语言switch中break的作用,C语言中switch...case语句中break的重要性
  4. HTML5 API详解(16):web socket 全双工通信
  5. Java7并发编程指南——第七章:定制并发类
  6. qq数据泄露_有哪些良好的上网习惯,可以避免隐私泄露?
  7. Python使用模糊哈希值比较文件相似度
  8. P1494 [国家集训队]小Z的袜子/莫队学习笔记(误
  9. 互联网日报 | 腾讯地图全国上线聚合打车服务;国庆档首日票房突破7亿;特斯拉国产Model3再降价...
  10. 【堆排序的递归和非递归实现】Java实现
  11. python神经网络图像分类,图像分类卷积神经网络
  12. c语言数字大小32768,c语言中int(2byte)的表示范围是为什么是-32768~32767!
  13. 阿里云邮箱域名解析设置要求
  14. 微信红包又创新纪录 跨年夜发红包数达23.1亿次
  15. 佳能数码相机,不能安装驱动程序
  16. 买的香港云服务器怎么用?云服务器使用教程
  17. 微信公众号支付开发配置
  18. 解决div高度不自动增加的问题
  19. Java_7.1 ArrayList应用点名器
  20. TI文档中的名词解释(持续更新中)

热门文章

  1. python环境搭建心得_python第一课 基本语法搭建以及环境
  2. 大数据集群搭建(一)虚拟机和Centos6的安装
  3. 决策树(回归树)——波士顿房价
  4. 国产MCU-CW32F030开发学习-圆形GC9A01_LCD模块
  5. Go框架之Beego简介部署及程序流程整合
  6. 从摆地摊到开网店,这对小夫妻一年狂赚45万元
  7. 腾讯企业邮箱产品优势
  8. Phrack安全杂志:详细分析堆栈溢出Smashing The Stack For Fun And Profit(Aleph One) 关于粉碎堆栈的秘密
  9. VC6.0的MFC简单计算器制作
  10. Qt项目: 图片查看器