Android Webview与ScrollView的滚动兼容及留白处理的方法
作者:Cosecant 发布时间:2021-09-27 00:56:40
本文介绍了Webview与ScrollView的滚动兼容及留白处理,分享给大家,具体如下:
背景
开发中我们经常会遇到使用网页来显示图文内容,而且往往我们会遇到webview嵌套在scrollview的这种情况,这就开始让人蛋疼了!“为嘛,我的webview加载出来的网页只显示很小一点,其他都不显示了?” ”当我重新刷新页面后,为什么webview会出现留白的情况?“ ----------------- 天啊,难道就不能好好的吗?!
为了解决项目中这些蛋疼的问题,试过不少方法,网上有说是网页中使用了不合理的overflow,的确,经证实使用不合理的overflow的确会造成网页加载后在嵌套在scrollview的webview只会显示很小的高度,那体验是相当的尴尬。合理使用overflow即可处理这个问题,但是webview留白又如何处理呢?问题先放这儿,我们先说说如何在xml布局中放置webview并设置他的属性。
层层递进,先练基本功
xml中webview嵌套在scrollview中:
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:descendantFocusability="blocksDescendants"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<com.xxxx.NoWrapListView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"/>
<WebView
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
</ScrollView>
其中webview要的高度要设置为:wrap_content, 如有必要可设置scrollview第一个子容器的这个属性:
android:descendantFocusability="blocksDescendants"
发现问题,问题是如何造成的
我们使用webview加载网页,网页可能在我们需要的时候会要求我们刷新网页或者加载新的链接,这时候问题就显现了。由于网页页面加载内容的长度,或者ajax请求延迟,造成webview只能不断的增加高度,而当网页高度变小时,webview高度却不能自适应了,那么只能由我们手动的搞些事情了!
解决问题,解决留白,刻不容缓
1、重载WebViewClient,重写onPageFinished方法。
inner class XWalkWebClient : WebViewClient() {
override fun onPageStarted(view: WebView?, url: String?, favicon: Bitmap?) {
super.onPageStarted(view, url, favicon)
isPageLoadSuccess = true
}
override fun onPageFinished(view: WebView?, url: String?) {
super.onPageFinished(view, url)
view?.loadUrl("javascript:window.myapp.resize(document.body.getBoundingClientRect().bottom);") //此处调用了一个注入的js方法用来重载webview高度,可解决初始加载网页的问题,①
}
}
2、js注入,初始化注入方法
webBrowser?.addJavascriptInterface(MyAppJavascriptHandler(), "myapp")
inner class MyAppJavascriptHandler {
@JavascriptInterface
fun resize(documentBodyHeight: Int) {
if (isAllowReLayoutBrowser) {
(context as? Activity?)?.runOnUiThread {
ViewUtil.setViewLayoutParams<FrameLayout.LayoutParams>(webBrowser!!, {
it.width = context.resources.displayMetrics.widthPixels
it.height = (documentBodyHeight * context.resources.displayMetrics.density).toInt()
}) //重写webview的高度, ②
}
}
}
}
网页端也需要在数据加载完成后调用这个js注入方法
if(window.myapp.resize){
window.myapp.resize(document.body.getBoundingClientRect().bottom);
}
备注、解释:
①. document.body.getBoundingClientRect().bottom: 网页下边距离页面上边的距离
②. ViewUtil.setViewLayoutParams....方法的实现
/**
* 配置控件的布局属性
* @param view
* @param func 处理布局属性的回调方法
*/
@Suppress("unchecked_cast")
@JvmStatic
fun <T : ViewGroup.LayoutParams> setViewLayoutParams(view: View, func: (T) -> Unit) = with(this) {
val lp: T = view.layoutParams as T
func.invoke(lp)
view.layoutParams = lp
}
来源:http://www.jianshu.com/p/a6726d38bef6


猜你喜欢
- 文件切割和文件合并这个问题困扰了我有一段时间了(超过一天没做粗来)。找了好多博客,本来想转载一个来的 结果找不到了。很无奈。只好自己贴代码上
- Java的在还没有发现新写法之前时,我一直是这么初始化List跟Map://初始化List List&l
- 本文实例讲述了C#信号量用法。分享给大家供大家参考,具体如下:using System;using System.Collections.G
- LottieLottie 是 Airbnb 开源的一个动画项目,它支持 iOS, mac OS Android RN,由于某些复杂动画的实现
- 一、什么是JSONJSON: JavaScript Object Notation JS对象简谱,是一种类似于XML的语言。相比于XML,它
- 一、setting.xml文件的位置今天我们来谈谈Maven setting文件配置的禅定之道。不知道大家有没有听说过禅宗?嗯,没错,就是那
- 在使用Mybatis时,有的时候我们可以不用定义resultMap,而是直接在<select>语句上指定resultType。这
- Android CardView详解Android5.0中向我们介绍了一个全新的控件–CardView,从本质上看,可以将Car
- 在Android中图片的自动切换不仅可以实现自动切换,而且还可以使用手动切换。而且一般在切换的时候,在图片下方还带有其他内容的切换,用来标记
- 本文实例讲述了C#实现HSL颜色值转换为RGB的方法。分享给大家供大家参考。具体实现方法如下://This method converts
- 序言使用SpringBoot创建定时任务非常简单,目前主要有以下三种创建方式:一、基于注解(@Scheduled)二、基于接口(Schedu
- ? 通配符类型<? extends T> 表示类型的上界,表示参数化类型的可能是T 或是 T的子类;<? super T&
- 在Android串口通信:基本知识梳理的基础上,我结合我项目中使用串口的实例,进行总结;Android使用jni直接进行串口设备的读写网上已
- 你是否遇到过应用程序性能下降的问题?有没有想过提升Spring性能?如果是这样 - 那么这篇文章绝对适合你。在这里,我们将谈论使用超级强大和
- Spring内置 * 对于 Web 应用来说,ServletContext 对象是唯一的,一个 Web 应用,只有一个ServletCont
- 需求说明实际操作过程中,从D盘根目录下的ak.txt读取文件写入D盘根目录下的hello.txt文件内实现思路写两个方法,一个用于读取目标文
- 什么是接口:接口是一系列方法的声明,是一些方法特征的集合注意:在接口中只有方法名,没有方法体!关键字:interface(创建接口), im
- Mybatis判断空字符串先说结论:如果使用正确,是不会产生任何问题的。大家各种疑惑,全是使用不当产生的。先说正确的使用方式一般判空的方式就
- 本文实例讲述了Java实现删除排序数组中重复元素的方法。分享给大家供大家参考,具体如下:题目描述:给定一个排序数组,在原数组中删除重复出现的
- 本文实例讲述了连接Wifi和创建Wifi热点的方法。分享给大家供大家参考,具体如下:android的热点功能不可见,用了反射的技术搞定之外。