安卓开发——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)

大家都在看

  • redis高级

    1 redis高可用 主从复制存在的问题: 1 主从复制,主节点发生故障,需要做故障转移,可以手动转移:让其中一个slave变成master—>哨兵 2 主从复制,只能主…

    Linux 2023年6月14日
    087
  • 数据结构——光纤网络设计

    设计进度安排 1、分析居民区光纤网络的数据属性,并依据光纤铺设的功能要求,确定算法设计方案; 2、完成网络光纤铺设的数据结构设计工作,包括图文件的结构与存储结构、最小生成树的存储结…

    Linux 2023年6月6日
    083
  • 5.9 Linux Vim批量注释和自定义注释

    使用 Vim 编辑 Shell 脚本,在进行调试时,需要进行多行的注释,每次都要先切换到输入模式,在行首输入注释符 #再退回命令模式,非常麻烦。 连续行的注释其实可以用替换命令来完…

    Linux 2023年6月7日
    087
  • macbook air 2019 安装win10单系统

    目前不考虑写的太详细了,如果有同学遇到问题了我再完善,主要是把遇到的坑讲下第一步,准备2个U盘(如果不嫌麻烦一个也可以)1.用大白菜或者老毛桃将其中一个做成启动盘2.在window…

    Linux 2023年6月14日
    0115
  • 浪剑天下H5游戏详细图文架设教程

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Linux 2023年6月7日
    090
  • 数据结构-树

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Linux 2023年6月11日
    0107
  • 设计模式在业务系统中的应用

    本文的重点在于说明工作中所使用的设计模式,为了能够更好的理解设计模式,首先简单介绍一下业务场景。使用设计模式,可以简化代码、提高扩展性、可维护性和复用性。有哪些设计模式,这里就不再…

    Linux 2023年6月8日
    099
  • 系统复位到操作系统启动的简要流程图

    多核下,处理器由系统复位到操作系统启动的简要流程图; 其中第一列为处理器核初始化过程, 第二列为芯片核外部分初始化过程, 第三列为设备初始化过程, 第四列为内核加 载过程, 第五列…

    Linux 2023年6月14日
    091
  • 非常实用的 Shell 脚本

    检测两台服务器指定目录下的文件一致性 #!/bin/bash<br>#####################################<br>#&a…

    Linux 2023年5月28日
    068
  • PHP str_repeat()

    str_repeat str_repeat() 函数把字符串重复指定的次数。 示例: function strRepeat() { echo str_repeat("*&…

    Linux 2023年6月7日
    0178
  • phpcms抛出的二维数组转移到js,js中for….in遍历数组,用“.”连接来读出一维数组值

    直切正题: 1.phpcms在模版中读出数组有很多中方法,如,{pc:content action=”lists”}或{pc:get sql=”…

    Linux 2023年6月13日
    095
  • c++模板类的使用,编译的问题

    前两天在写代码时,把模板类的声明和分开放在两个文件中了,类似于下面这样: stack.hpp: #ifndef _STACK_HPP #define _STACK_HPP temp…

    Linux 2023年6月14日
    093
  • Redis-Cluster实战–5.使用redis-cli安装

    Redis-Cluster实战–5.使用redis-cli安装 博客分类: redis 缓存 redis-cluster redisCluster指派槽cluster-infom…

    Linux 2023年5月28日
    093
  • nginx-openresty通过location调用显示upstream信息

    背景 有时候查看nginx的upstream配置得知配置后端的ip地址和端口,但从日志里面发现提示后端不存在,想知道nginx的内存里面是否存在upstream的加载信息,判断后端…

    Linux 2023年6月6日
    0119
  • nginx配置只允许域名访问,禁止ip访问80,443端口

    一、背景客户扫描阿里云服务器,发现渗透漏洞(.git文件泄露漏洞),可以直接使用IP访问项目底下的某个文件,针对这个问题,需要对nginx进行配置,不使用IP访问项目,而只能使用域…

    Linux 2023年6月14日
    083
  • 干货!Zabbix+ES怎么玩?如何应对海量级监控数据?一文带你玩转开源解决方案。

    写在开篇 不管zabbix的后端数据库是oracle还是mysql,当zabbix监控的量级达到了一定程度后,那么对数据库的性能是一个非常严峻的挑战。特别是对历史数据的查询,将会变…

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