Android Webview与ScrollView的滚动兼容及留白处理的方法

 更新时间:2017年11月18日 09:43:46   作者:Cosecant  
本篇文章主要介绍了Android Webview与ScrollView的滚动兼容及留白处理的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文介绍了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
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Android自定义View实现水波纹引导动画

    Android自定义View实现水波纹引导动画

    这篇文章主要为大家详细介绍了Android自定义View实现水波纹动画引导,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-01-01
  • Android 解决build path errors的问题

    Android 解决build path errors的问题

    这篇文章主要介绍了Android 解决build path errors的问题的相关资料,需要的朋友可以参考下
    2016-09-09
  • Android编程自定义进度条颜色的方法详解

    Android编程自定义进度条颜色的方法详解

    这篇文章主要介绍了Android编程自定义进度条颜色的方法,结合实例形式分析了Android进度条颜色相关的属性设置操作技巧,需要的朋友可以参考下
    2017-09-09
  • android打开本地图像的方法

    android打开本地图像的方法

    这篇文章主要介绍了android打开本地图像的方法,涉及Android操作图像的相关技巧,需要的朋友可以参考下
    2015-04-04
  • 解决EditText不显示光标的三种方法(总结)

    解决EditText不显示光标的三种方法(总结)

    下面小编就为大家带来一篇解决EditText不显示光标的三种方法(总结)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-04-04
  • Android按钮美化样式的实现代码

    Android按钮美化样式的实现代码

    本文给大家介绍android按钮美化样式的实现代码,主要是通过在drawable文件夹下 新建button_drawable.xml,具体实现代码跟随小编一起看看吧
    2019-11-11
  • Android SdkVersion的区别及获取版本信息方法

    Android SdkVersion的区别及获取版本信息方法

    下面小编就为大家带来一篇Android SdkVersion的区别及获取版本信息方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • Android编程实现对话框形式进度条功能示例

    Android编程实现对话框形式进度条功能示例

    这篇文章主要介绍了Android编程实现对话框形式进度条功能,结合具体实例形式分析了Android对话框形式进度条的功能与布局相关实现技巧,需要的朋友可以参考下
    2017-09-09
  • Android实现图片浏览并改变透明度

    Android实现图片浏览并改变透明度

    这篇文章主要为大家详细介绍了Android实现图片浏览并改变透明度,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-08-08
  • Android 进度条自动前进效果的实现代码

    Android 进度条自动前进效果的实现代码

    这篇文章主要介绍了Android 进度条自动前进效果,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07

最新评论