onReceivedTitle()不被調用問題解決

情景說明

今天在寫一個WebView界面,該Webview中有兩層網頁跳轉,跳轉後更新ActionBar中的標題。測試時發現三星手機在WebView回退
(即:goBack())後ActionBar中的Title不更新,而Nexus6p Android7.0可以更新Title。Debug後找發現是由三星手機
在WebView回退時不會調用WebChromeClient.onReceivedTitle()方法造成的。

解決思路

由於WebChromeClient.onReceivedTitle()只在回退時不會調用且WebView.getTitle()返回null(見源碼),我們可以講每層的Title
存儲在List中,當WebView回退時使用List中最後一個元素設置ActionBar的Title。

代碼流程

1.自定義WebView
public class MyWebView extends WebView{

    ...

    // 用於存儲每層web的標題
    private List<String> titles =  new ArrayList<>() ;
    public MyWebView (Context context){
        super(context) ;

        ...

        setWebChromeClient(new WebChromeClient(){
            // 用於存儲webview內跳轉的title,在webchromeclient中處理,因getTitle()返回null
            // 非回退時(包括三星手機)webChromeClient.onReceivedTitle()會被調用,
            // 所以在這裏存儲處理標題
            @Override
            public void onReceivedTitle(WebView view, String title) {
                titles.add(title) ;
                ...
            }
        });
    }

    /**
     * 由於系統默認返回null,這裏覆寫以返回真實的Title
     * @return
     */
    @Override
    public String getTitle() {
        ...

        if(titles.size() > 0){
            return titles.get(titles.size() - 1) ;
        }else {
            return "" ;
        }
    }

    /**
     * webview回退時應該刪除存儲的最後一個標題
     */
    @Override
    public void goBack() {

        ...

        if(titles.size() > 0){
            titles.remove(titles.size() - 1) ;
        }
        super.goBack();
    }
}
2.Activity中監聽回退操作
由於Activity中操作比較靈活回退的方法有多種如:ActionBar左上角的回退按鈕,onKeyDown,onBackPressed等,
所以這裏不貼代碼了,直接寫操作思路:當觸發回退時,首先判斷WebView是否可以回退,如果WebView可以回退,
actionBarTitle.setText(mWebView.getTitle()) ;// 這裏是覆寫後的getTitle() 
否則銷燬Activity即可。

答覆

1.1樓答覆
在onPageFinished通過webView.getTitle()不一定可行,例如:在Android api 22(更低的版本沒有看)的代碼中WebView是這樣處理的:

這裏寫圖片描述

標題直接返回null ;而在Android api 24中WebView是這樣處理的:

這裏寫圖片描述

可見Google修復了這個問題,爲了更好的兼容性,還是自己控制標題吧,反正方法都是覆寫的原方法,使用感覺是一樣的。
發佈了89 篇原創文章 · 獲贊 67 · 訪問量 21萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章