情景說明
今天在寫一個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{
...
private List<String> titles = new ArrayList<>() ;
public MyWebView (Context context){
super(context) ;
...
setWebChromeClient(new WebChromeClient(){
@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修復了這個問題,爲了更好的兼容性,還是自己控制標題吧,反正方法都是覆寫的原方法,使用感覺是一樣的。