安卓开发——WebView+Recyclerview文章详情页,解决高度问题

安卓开发——WebView+Recyclerview文章详情页,解决高度问题

最近在写一个APP时,需要显示文章详情页,准备使用WebView和RecyclerView实现上面文章,下面评论。出现了WebView高度问题,WebView加载 HTML格式数据,而非 URL

  • 这里的 WebView为自定义组件 NestedScrollingWebView,已解决嵌套滑动问题。
  • 如果WebView设置为 wrap_content,会出现下面的评论会在WebView渲染数据时提前显示在上面的情况,很不美观
  • 如果WebView设置为 match_parent,当文章高度不足一屏时,下面空白太大,不美观。

案例

设置为wrap_content

安卓开发——WebView+Recyclerview文章详情页,解决高度问题

设置为match_parent

安卓开发——WebView+Recyclerview文章详情页,解决高度问题

设置为match_parent,不另设置高度

安卓开发——WebView+Recyclerview文章详情页,解决高度问题

通过JS设置高度

安卓开发——WebView+Recyclerview文章详情页,解决高度问题

解决方案

利用 JS获取高度,然后通知( loadUrl(js))WebView改变高度。关于 JS获取高度,这里采用了一种我觉得很准确的方法

private fun getHtmlData(title:String, bodyHTML: String): String {
    val head = ("" +
                " " +
                "")
    return "$head" +
    "$title$bodyHTML" +
""
}

在文章内容的最下面加一个 div,通过 document.querySelector('.bottom').offsetTop来用于确定高度

具体方法

1、先创建一个 Mobile

private inner class Mobile {
    @JavascriptInterface
    fun onGetWebContentHeight(height: Int) {
        contentWV.post {
            val layoutParams = contentWV.layoutParams
            layoutParams.height = Utils.getPixelByDp(this@JsSetHeightActivity, height)
            contentWV.layoutParams = layoutParams
            Log.i(TAG, "onGetWebContentHeight: height=$height")
        }
    }
}

2、在初始化 WebView时,设置必要参数

private fun initView() {
    contentWV = findViewById(R.id.content_wv)

    // 开启js
    val setting = contentWV.settings
    setting.javaScriptEnabled = true

    // 添加JS接口
    val mobile = Mobile()
    contentWV.addJavascriptInterface(mobile, "mobile")

    // 在 onPageFinished时重新设置高度
    val webClient = object : WebViewClient() {
        override fun onPageFinished(view: WebView?, url: String?) {
            val js = "javascript:mobile.onGetWebContentHeight(document.querySelector('.bottom').offsetTop)"
            view?.loadUrl(js)
        }
    }
    contentWV.webViewClient = webClient
}

在页面加载完成之后,会重新设置高度

Demo下载

文章详情 Demo下载

参考

文中的 WebView以及 NestedScroll的用法参考:10分钟带你入门NestedScrolling机制 – SegmentFault 思否

其他实现方案:上面webview 下边评论 (applemei.com)

Original: https://www.cnblogs.com/sw-code/p/15442787.html
Author: sw-code
Title: 安卓开发——WebView+Recyclerview文章详情页,解决高度问题

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/585584/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Kubernetes 安装Redis集群

    一、Operator 以集群模式安装 可以在service_account和 operator后面加-n 参数指定namespace 这个yaml文件中使用的资源较高,测试环境可能…

    Linux 2023年5月28日
    074
  • Python 排序算法之快速排序

    快速排序之分治法三步走 """ 快速排序 分治法(divide and conquer),三步走 1. Partition:选择一个基准(pivot)…

    Linux 2023年6月13日
    0105
  • 6.19(junit–>在maven和Spring中的使用)

    写文章要不忘初心,今天也要继续努力~ 白盒测试:是一种测试用例设计方法,在这里盒子指的是被测试的软件,白盒,顾名思义即盒子是可视的,你可以清楚盒子内部的东西以及里面是如何运作的,因…

    Linux 2023年6月7日
    0106
  • 统计算法_数值/线性关系度量

    继续统计算法,这次也没什么特别的,还没到那么深入,也是比较基础的1、方差-样本2、协方差(标准差)-样本3、变异系数4、相关系数 依然是先造个list,这次把这个功能写个函数,方便…

    Linux 2023年6月6日
    0158
  • centos7磁盘扩容

    1.先增加一块磁盘 2.查看虚拟机磁盘[root@book ~]# df -h 记住红框里的位置信息 3.查看当前磁盘分区表[root@book ~]# fdisk -l 4.输入…

    Linux 2023年6月8日
    0103
  • python的日期处理

    俗话说,工欲善其事必先利其器,所以在使用日期前要先对日期进行处理,所以时间戳和字符串的来回来去转换这个事肯定是要搞的 这次的函数有一个?有两个?有三个?有四个!上代码! 哈哈,像不…

    Linux 2023年6月6日
    088
  • K8s-小型综合实验(k8s+keeplived+nginx+iptables)

    K8S小型综合实验(k8s+keeplived+nginx+iptables) 实验目的 1.Kubernetes 区域可采用 Kubeadm 方式进行安装。 2.要求在 Kube…

    Linux 2023年6月13日
    0113
  • PHP使用pdfparser实现对PDF转换成本文

    使用pdfparser对PDF转换成文本形式,转换后没有格式。 原始PDF: 转换成文本: 第一步:安装pdfparser composer require smalot/pdfp…

    Linux 2023年6月7日
    0120
  • Linux关于防火墙的命令

    Linux关于防火墙的命令 一、red hat/CentOs7关闭防火墙的命令 查看防火墙状态 systemctl status firewalld service iptable…

    Linux 2023年6月11日
    0101
  • 继承与初始化

    了解包括继承在内的初始化全过程: 执行结果: 程序运行时,先试图访问Beetle.main()(一个static方法),访问Beetle类的静态方法将会使Beetle类加载,即加载…

    Linux 2023年6月8日
    0115
  • Redis的发布订阅及.NET客户端实现

    序言 发布订阅在设计模式中也可以说是观察者模式,针对这个模式是处理对象间一对多的依赖关系的,当一个对象发生变化,其它依赖他的对象都要得到通知并更新。 然而它也有自己的缺点,就是当主…

    Linux 2023年5月28日
    0123
  • Python 内置logging 使用详细讲

    logging 的主要作用 提供日志记录的接口和众多处理模块,供用户存储各种格式的日志,帮助调试程序或者记录程序运行过程中的输出信息。 logging 日志等级 logging 日…

    Linux 2023年6月7日
    083
  • 在vue中使用websocket回调函数中调用其他methods函数报错Uncaught TypeError: this.getHistory is not a function at WebSocket.ws.onmess解决方案

    1、报错详情 在vue中,使用了websocket类,在websocket的onmessage回调函数中调用methods的 getHistory 函数,发现一调用就报错 Unca…

    Linux 2023年6月8日
    093
  • Redis安装及HA(High Availability)配置

    Redis是一种内存数据库,以KEY-VALUE(即键值对)的形式存储数据。这篇文章主要介绍的是Redis安装及配置,所以不对Redis本身作详细介绍了。 下 载: 解 压: 以r…

    Linux 2023年5月28日
    093
  • Jenkins

    Jenkins Jenkins jenkins简介 jenkins工作原理 jenkins特点 CI/CD是什么 使用tomcat容器安装jenkins jenkins流水线项目发…

    Linux 2023年6月6日
    0127
  • 最简单的,在win,linux中,用powershell,自动获取Let’s Encrypt证书方法

    powershell传教士原创 2020-04-12,2022-05更新 Let’s Encrypt证书有效期3个月,支持泛域名【*.你的网站.net】。支持n天内(一…

    Linux 2023年6月14日
    0106
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球