今天做項目的時候,老大讓我把之前做的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);}好了,到這里我們就維護好了標題實時改動了,我們來看看效果吧!

新聞熱點
疑難解答