Android使用Native和Web混合开发时,一般Native提供WebView和TitleBar(eg:ToolBar)作为壳,虽然大部分逻辑由网页自行完成,但是一些必要的逻辑还是需要Native来完成,例如按回退键、标题的显示、弹框的Native替换(当然标题栏由Web完成的除外)需要Native完成,所以就需要Native获取Web页面的基本信息来完成,例如:
页面回退:
/**
* 物理返回键和标题栏返回键监听事件
*/
override fun onBackClick(view: View?) {
if (mWebActWebContainer.canGoBack()) {
mWebActWebContainer.goBack()
} else {
super.onBackPressed();
}
}
标题显示:
override fun onReceivedTitle(view: WebView, title: String) {
//标题显示
}
问题:
通常将标题显示逻辑放在onReceivedTitle()中,但是这儿有一个问题,就是有一些机型在网页回退的时候不回调onReceivedTitle()导致标题显示失败。
解决方案
所以为了适配就需要考虑解决方案,既然回退onReceivedTitle()不回调,那么页面加载完毕onPageFinished()时肯定会回调,所以可以将标题显示逻辑显示在onPageFinished(),那么就要将每一个页面的标题保存下来然后在onPageFinished()中显示,另外需要说明的是onReceivedTitle()是在onPageFinished()之前回调,所以我们可以在初次进入时在onReceivedTitle获取页面title并保存到一个Map中,然后在onPageFinished()获取并显示,代码如下:
override fun onReceivedTitle(view: WebView, title: String) {
//保存数据,url作为Key
titleMap.put(view.url, title)
}
override fun onPageFinished(view: WebView, url: String) {
val title = titleMap.get(mWebActWebContainer.url)
//TODO 显示
}
这样就可解决部分机型页面回退导致的标题显示失败的问题
网友评论