2015-04-21 61 views
1

在我的應用程序中有一個顯示Html內容的WebView和一個後退按鈕,讓用戶在瀏覽器歷史記錄中導航回來。在WebChromeClient中,我在onReceivedTitle()中獲得Html頁面標題並將其顯示在我的應用程序中。goBack()之後從WebView History獲取Html頁面的標題?

顯示用戶第一頁並顯示第一頁標題。用戶可以點擊Html中的超鏈接進入下一頁。第二頁有一個不同的標題,並且這是正確顯示。問題是,如果用戶比單擊「後退」按鈕,第一頁從歷史播放,但onReceivedTitle()不會再次調用。所以我的第一頁顯示第二頁的錯誤標題。

如何獲得正在通過調用goBack()加載的頁面的標題?

下面是一些簡化的代碼來演示。想象一下帶有TextView,WebView和Button的佈局。另外,想象資產文件夾中的兩個Html文件,其中pageone.html鏈接到pagetwo.html,並且這兩個頁面具有不同的標題。

public class MyActivity extends Activity { 
    WebView webView; 
    TextView title; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     webView = (WebView) findViewById(R.id.webView); 
     title = (TextView) findViewById(R.id.title); 
     webView.loadUrl("file:///android_asset/pageone.html"); 

     webView.setWebChromeClient(new WebChromeClient() { 
      @Override 
      public void onReceivedTitle(WebView view, String titleText) { 
       super.onReceivedTitle(view, titleText); 
       title.setText(String.format("Title: %s", titleText)); 
      } 
     }); 

     final Button button = (Button) findViewById(R.id.backButton); 
     button.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       if (webView.canGoBack()) { 
        webView.goBack(); 
       } 
      } 
     }); 
    } 

} 
+0

你可以得到webview並調用webView.getTitle(); –

+0

是的,但在什麼情況下? onPageFinished()可以使用,但是然後onReceivedTitle()似乎沒用。 –

回答

1

顯然,這是一個bug in certain builds of Android並用於正常工作。


使用建議從https://stackoverflow.com/a/12154530/90236我了,可是我覺得我的答案是不使用onReceivedTitle(),因爲它是不是一個GoBack的後調用。

如果您需要處理goBack(),WebViewClient中的onPageFinished()似乎更好。

這似乎是工作:

public class MyActivity extends Activity { 
    WebView webView; 
    TextView title; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     webView = (WebView) findViewById(R.id.webView); 
     title = (TextView) findViewById(R.id.title); 
     webView.loadUrl("file:///android_asset/pageone.html"); 

     webView.setWebViewClient(new WebViewClient() { 
      @Override 
      public void onPageFinished(WebView view, String url) { 
       title.setText(String.format("Title: %s", view.getTitle())); 
      } 
     }); 

     final Button button = (Button) findViewById(R.id.backButton); 
     button.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       if (webView.canGoBack()) { 
        webView.goBack(); 
       } 
      } 
     }); 
    } 

} 

然而,這種變化的時候,Android應用程序通知標題的時機。我發現的是:

  1. WebChromeClient.onReceivedTitle首先發生。但是,當使用webView.goBack()導航到頁面時,不會發生此事件。
  2. 然後將HTML頁面加載和DOM的window.onload發生
  3. 最後WebViewClient.onPageFinished如果使用JavaScript來更新頁面的標題,用onPageFinished可能比onReceivedTitle完全不同的行爲發生

因爲事件時間。