webview与h5交互大全android开发工作随笔

android WebView 调用goBack()后标题不改变

2016-08-24  本文已影响2179人  元亨利贞o

今天遇到两个webview兼容性问题

项目里某些页面内嵌了h5页面. 这样的页面使用了WebView, 页面头部是ActionBar. 需求是ActionBar的title跟h5页面的标题要一致. 一般做法是给WebView设置WebChromeClient, 重写WebChromeClient的onReceivedTitle()方法, 在此方法中设置ActionBar的title. 因为onReceivedTitle方法的第二个参数就是html5页面的title .......

  1. 问题一: 在某些机型(如红米)上, WebView调用goBack()方法后, onReceivedTitle( )方法不调用 (加载页面时, onReceivedTitle方法是会调用的), 这样ActionBar上的标题和h5页面就对应不上.

  2. 问题二: 在某些机型上(如Vivo Xplay系列, 系统为4.2.2), h5页面的高度不能渲染出来. 即css明明设置了高度, 但是h5页面却显示不出来. 如下面html文件的高度就没有渲染出来

<p style="width:300px; height:400px;background:red">Hello world !</p>

解决方法:
一. 标题问题解决方法

  1. 方法一
    a. 在Activity添加一个标题栈记录标题:
Stack<String> titleStack = new Stack<String>();

者使用HashMap记录每个页面的标题, key为h5页面的url, value为标题, 如:

HashMap<String,String> titleStack = new HashMap<String,String>();

b. 在onReceivedTitle()方法中记录h5页面的title
c. 在退出页面是手动更新标题, 如: 在onBackPressed方法中, 调用goBack方法后, 将对应的title pop出来, 重新设置给ActionBar

  1. 方法二 (炒鸡简单)
    a. 给WebView设置WebViewClient, 重写WebViewClient的onPageFinished()方法. goBack()方法调用后, 此方法也是会调用的, 因此, 可以在此方法中设置ActionBar的标题, 代码如下:
@Override
public void onPageFinished(WebView view, String url) {
    ActionBar actionBar = getSupportActionBar();
    actionBar.setTitle(view.getTitle());
}

二. css渲染问题的解决方法
添加如下语句即可(ws是WebSettings). 原因暂时不明, 知道的朋友可以告诉我, 非常感谢~~

ws.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NORMAL);

如有纰漏, 欢迎指正 ~~

上一篇下一篇

猜你喜欢

热点阅读