前言
????老規(guī)矩,先感覺給我提供思路的作者及文章《ScrollView與WebView結合使用時,設置webview字體大小的時候出現(xiàn)下方留白的終極解決方案》。
????因為需求的原因,需要上面是網頁,下面是一些推薦。上級不想用網頁去展示,因為打開速度太慢了。只能通過加載數(shù)據,獲取html源代碼展示出網頁,然后獲取推薦內容,通過ListView展示數(shù)據。這時候我想了有兩種方案,一種是ScrollView+WebView+ListView,以及一種是拼接HTML。結果上級又不讓用拼接HTML,只能使用ScrollView+WebView方案,如果沒有設置字體大小這種產品需求,我也不會有這個問題,正式因為這種需求,加上這個方案,才搞出來這個幺蛾子,。
解決方案
思路還是通過JS去獲取body內容的Height。
step.1 設置JS接口監(jiān)聽
@JavascriptInterface
fun resize(height: Int) {
LogUtils.i("resize contentHeight=$height Height=${height * resources.displayMetrics.density} ")
runOnUiThread {
val wblp = webView?.layoutParams
wblp?.height = (height * resources.displayMetrics.density).toInt()
webView?.layoutParams = wblp
}
}
step.2 注冊JS方法
webView?.addJavascriptInterface(this, "notifyResize")
step.3 設置setting.textZoom去改變字體的大小
webView?.settings?.textZoom = when (it) {
0 -> 80
1 -> 100
2 -> 120
3 -> 140
else -> 100
}
webView?.loadUrl("javascript:window.notifyResize.resize(document.body.getBoundingClientRect().height);")
但是我一度疑惑,這個方法和webView?.contentHeight有什么區(qū)別呢?雖然獲取的到是html的真實高度,然后乘以屏幕密度,和webView?.contentHeight的高度是一樣的啊。
而且我設置放大后,再縮小字體依舊并不生效。contentHeight一直就是最大狀態(tài)了。
為什么大家都推崇這個解決方案,但是我不生效呢?
后來繼續(xù)查原因,才發(fā)現(xiàn)大家都一樣。如果您使用的是webView?.loadUrl,使用這個方案是可以的,但是如果您使用的是webView?.loadDataWithBaseURL就會失敗。
重要的來了,那使用webView?.loadDataWithBaseURL這個方案怎么解決呢?
我們只要添加下面這段代碼,重新設置body的高度就可以了。
webView?.loadUrl("javascript:(function() {document.body.style.height='initial';})()")
最終使用
viewModel.contentSize.observe(viewLifecycleOwner, Observer {
webView?.settings?.textZoom = when (it) {
0 -> 80
1 -> 100
2 -> 120
3 -> 140
else -> 100
}
webView?.loadUrl("javascript:(function() {document.body.style.height='initial';})()")
webView?.loadUrl("javascript:window.notifyResize.resize(document.body.getBoundingClientRect().height);")
})