我的文章详细信息页面的设计如下:上面的部分是原生的,而文章的其余部分(图像、嵌入、推文...)作为 HTML 内容接收。 我想实现字体调整大小功能,为此我使用了
mutableIntState
,这会导致每当滑块具有新值时标题和摘要就会被 重新组合。
不幸的是,它不影响网页视图!尽管我创建了一个自定义 Webview 可组合项,它采用以下参数:
视图模型:
class PageViewModel: ViewModel(){
//get initial value from sharedPreferences
var fontSize by mutableIntStateOf(Utility.getFontSize())
private set
fun updateFontSize(newValue:Int){
fontSize = newValue
//store new value in shared preferences
Utility.saveFontSize(newValue)
}
}
我的屏幕:
@Composable
fun MyScreen(title: String, summary: String, html: String){
val myViewModel: PageViewModel = viewModel()
Column{
....
//the slider enables the user to select a value ranging between 16f & 26f
Slider(onValueChange = {myViewModel.updateFontSize(it.toInt())},
steps = 3, valueRange= 16f .. 26f, value = myViewModel.fontSize.toFloat())
...
Text(text = title, fontSize = (myViewModel.fontSize + 6).dp)
Text(text = summary, fontSize = myViewModel.fontSize.dp)
MyCustomWebView(html = html, fontSize = fontSize)
}
}
我的自定义Webview如下:
@Composable
fun MyCustomWebView(html:String, fontSize: Int){
val context = LocalContext.current
//assuming that html is an html snippet
val htmlStyled = "<html><head><style>body,p,h1,h2,h3,span,a{font-size: ${fontSize}px!important;}</style></head><body>${html}</body></html>"
AndroidView(modifier = Modifier.fillMaxWidth(),
factory = {
WebView(context).apply{
webViewClient = WebViewClient()
settings.cacheMode = WebSettings.LOAD_NO_CACHE
settings.setRenderPriority(WebSettings.RenderPriority.HIGH)
settings.javaScriptEnabled = true
settings.domStorageEnabled = true
settings.allowFileAccess = true
//I even tried using the depricated textSize
//It doesn't update live
/*settings.textSize = when (fontSize) {
16 -> WebSettings.TextSize.SMALLEST
18 -> WebSettings.TextSize.SMALLER
21 -> WebSettings.TextSize.NORMAL
23 -> WebSettings.TextSize.LARGER
else -> WebSettings.TextSize.LARGEST
}*/
loadDataWithBaseURL("", htmlStyled, "text/html", "UTF-8","")
}
}
}
非常感谢任何帮助。 谢谢。
在AndroidView中必须使用
update
值参数..所以customWebView变成如下:
@Composable
fun MyCustomWebView(html:String, fontSize: Int){
.......
AndroidView(modifier = Modifier.fillMaxWidth(),
factory = {...},
update = { it.settings.textZoom = fontSize * 6
})
}