今天做项目的时候,老大让我把之前做的webview打开网页的功能修改一下,说是要动态的获取网页的标题,然后显示在我们自己app的标题栏上,然后我就屁颠屁颠的跑去看webview的源码,看看有没有获取标题这个方法。
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,因为每次打开新的网页,完成之后都会执行这个方法:
@Overridepublic void onPageFinished(WebView view, String url) { loadHistoryUrls.add(url);}那我们在哪里删除呢?当然是返回的地方啊:
/** * 改变返回键的功能,当网页中有需要返回的界面时,网页中优先 * * @param keyCode * @param event * @return */@Overridepublic 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);}好了,到这里我们就维护好了标题实时改动了,我们来看看效果吧!
新闻热点
疑难解答