安卓开发——WebView+Recyclerview文章详情页,解决高度问题
最近在写一个APP时,需要显示文章详情页,准备使用WebView和RecyclerView实现上面文章,下面评论。出现了WebView高度问题,WebView加载 HTML
格式数据,而非 URL
。
- 这里的
WebView
为自定义组件NestedScrollingWebView
,已解决嵌套滑动问题。 - 如果WebView设置为
wrap_content
,会出现下面的评论会在WebView渲染数据时提前显示在上面的情况,很不美观 - 如果WebView设置为
match_parent
,当文章高度不足一屏时,下面空白太大,不美观。
案例
设置为wrap_content
设置为match_parent
设置为match_parent,不另设置高度
通过JS设置高度
解决方案
利用 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下载
参考
文中的 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/
转载文章受原作者版权保护。转载请注明原作者出处!