序言
今天做项目的时候,老大让我把之前做的webview打开网页的功能修改一下,说是要动态的获取网页的标题,然后显示在我们自己app的标题栏上,然后我就屁颠屁颠的跑去看webview的源码,看看有没有获取标题这个方法。
需求:这个是我在Activity中放的一个webview,上面一个title,然后当我点击网页中的链接的时候,我希望页面的title也会跟着改变,当我返回的时候,我也希望title变回当前网页的title
一、首先,webview的加载在这里我们就不多说了,往上有很多这样的例子,如果还不清楚的,请看Webview合集 - 简书
二、然后我们需要获取网页的title
1、在webview中有一个组件,叫做WebChromeClient,这个组件是用来协助Webview处理Js的一些东西的,比如说网站的图标,网站的title,网站的加载进度等等,所以我们可以用这个来获取title。实现它里面的onReceivedTitle这个方法即可:
WebChromeClient wcc = new WebChromeClient() {
@Override
public void onReceivedTitle(WebView view, String title) {
super.onReceivedTitle(view, title);
tvTitle.setText(title);
}
};
获取这个title就可以了,可能有人要说了,你都没有跟你访问的url关联起来,它怎么就能获取title了,难不成他还能上天不成,别急嘛!咱后面还有呢!
2、在webview中还有另外一个组件,叫做WebViewClient,这个组件主要用来辅助webview处理一些简单的html页面内容,比如各种通知,请求事件等等,也就是说在用这个组件你可以监听网页加载是否完成,是否开始等等,然后还有就是可以设置是否在外部浏览器中浏览:
mWebView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
return false;
}
});
在执行完这个组件之后我们再来绑定我们的url:
mWebView.loadUrl(url);
好了,现在就可以实时的更换你的title了,但是这里还有一个bug,当然了,这不是我的bug,是WebChromeClient的bug,按返回键的时候,是不会执行onReceivedTitle这个方法的,所以返回的时候title就不会动态的改变了,后来百度到有方法可以让他动态的改变,那就是自己维护,何为自己维护呢:
就是自己创建一个栈,也就是list,来动态添加,删除你浏览的网页
好了,方法有了,咱们来实践一下
private List<String> loadHistoryUrls=new ArrayList<>();
然后我们在刚才WebViewClient那里增加一个方法,onPageFinished,因为每次打开新的网页,完成之后都会执行这个方法:
@Override
public void onPageFinished(WebView view, String url) {
loadHistoryUrls.add(url);
}
那我们在哪里删除呢?当然是返回的地方啊:
/**
* 改变返回键的功能,当网页中有需要返回的界面时,网页中优先
*
* @param keyCode
* @param event
* @return
*/
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
if (mWebView.canGoBack()) {
if (loadHistoryUrls.size() > 1) {
//重新加载之前的页面,这里为了让标题也能正常显示
String url = loadHistoryUrls.get(loadHistoryUrls.size() - 2);
loadHistoryUrls.remove(loadHistoryUrls.size() - 1);
if (loadHistoryUrls.size() > 0) {
loadHistoryUrls.remove(loadHistoryUrls.size() - 1);
}
mWebView.loadUrl(url);
return true;
}
}
}
return super.onKeyDown(keyCode, event);
}
好了,到这里我们就维护好了标题实时改动了,我们来看看效果吧!