2011-11-19 59 views
34

我在我的應用程序中使用WebView,我有一個要求根據用戶頁面更改應用程序標題。我如何在Android WebView中執行此操作?如何在Android WebView中獲取加載的網頁標題?

我這樣做是在iphone按照行

self.title = [webPage stringByEvaluatingJavaScriptFromString:@"document.title"] 

@Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     // Adds Progrss bar Support 
     this.getWindow().requestFeature(Window.FEATURE_PROGRESS); 
     setContentView(R.layout.webview); 

     // Makes Progress bar Visible 
     getWindow().setFeatureInt(Window.FEATURE_PROGRESS, Window.PROGRESS_VISIBILITY_ON); 

     mWebView = (WebView) findViewById(R.id.webview); //This is the id you gave 
     //to the WebView in the main.xml 
     mWebView.getSettings().setJavaScriptEnabled(true); 
     mWebView.getSettings().setSupportZoom(true);  //Zoom Control on web (You don't need this 
     //if ROM supports Multi-Touch  
     mWebView.getSettings().setBuiltInZoomControls(true); //Enable Multitouch if supported by ROM 

     // Load URL 
     Bundle b = getIntent().getExtras(); 
     String url = b.getString("url"); 
     Log.d(TAG, "url " + url); 
     mWebView.loadUrl(url); 


     // Sets the Chrome Client, and defines the onProgressChanged 
     // This makes the Progress bar be updated. 
     mWebView.setWebChromeClient(new WebChromeClient() { 
      public void onProgressChanged(WebView view, int progress){ 
       //Make the bar disappear after URL is loaded, and changes string to Loading... 
       myActivity.setTitle("Loading..."); 
       myActivity.setProgress(progress * 100); //Make the bar disappear after URL is loaded 

       // Return the app name after finish loading 
       if(progress == 100) 
        myActivity.setTitle(R.string.app_name); 
      } 
     }); 

     mWebView.setWebViewClient(new WebViewClient(){ 

      @Override 
      public boolean shouldOverrideUrlLoading(WebView view, String url) { 
       view.loadUrl(url); 
       return true; 
       // return super.shouldOverrideUrlLoading(view, url); 
      } 

      @Override 
      public void onLoadResource(WebView view, String url) { 
       // TODO Auto-generated method stub 
       super.onLoadResource(view, url); 
      } 

      @Override 
      public void onPageFinished(WebView view, String url) { 
       super.onPageFinished(view, url); 
       ImageView logoImageView = (ImageView)findViewById(R.id.logoimage); 
       logoImageView.setVisibility(View.GONE); 
       Log.d(TAG, "view.getTitle() " + view.getTitle()); 
       myActivity.setTitle(view.getTitle()); 
      } 

     }); 

    } 

回答

74

你必須使用自定義WebViewClient來完成這件事。 您將覆蓋onPageFinished()方法,因此當新頁面完成加載時,可以將webview設置爲適當的標題。

下面是上述的樣本實現:

WebView mWebView = (WebView) findViewById(R.id.mwebview); 
    mWebView.setWebViewClient(new WebViewClient() { 
     @Override 
     public void onPageFinished(WebView view, String url) { 
      ExperimentingActivity.this.setTitle(view.getTitle()); 
     } 
    }); 

你一個要做到這一點,你要初始化你的網頁流量。 將「ExperimentingActivity」替換爲您的活動名稱。

如果您已經覆蓋了WebViewClient,只需將此函數或代碼添加到您已有的函數中即可。

你可以在類和函數我用在這裏更多的信息:

Android Developers: Activity - setTitle()

Android Developers: WebViewClient

Android Developers: WebView

+0

當然沒問題。只需查看我發佈的文檔鏈接,就可以掌握可以使用WebView類和WebViewClient執行的操作。它起初可能看起來很複雜,但它給了你很大的靈活性。 – DallaRosa

+0

這工作,感謝您的幫助。 – Sam

+0

我可以讀取值,但是當我設置它的值不顯示在應用程序標題中時,我用我的web視圖實現更新了問題。請幫助 – Sam

38

我的觀察是,你得到的網頁標題在較短的時間內使用WebChromeClientWebViewClient

webview.setWebChromeClient(new WebChromeClient() { 
    @Override 
    public void onReceivedTitle(WebView view, String title) { 
     super.onReceivedTitle(view, title); 
     if (!TextUtils.isEmpty(title)) { 
      YourActivity.this.setTitle(title); 
     } 
    } 
}); 
+1

+1以獲得優雅的解決方案 – Abhijit

+3

偉大的解決方案。爲許多人工作。非常感謝。 – Tony

+2

調用WebView.goBack()後,這似乎不會被調用。所以,如果你需要處理導航,我認爲onPageFinished()可能是更好的選擇。 –

0

所以我的經驗你應該使用onReceivedTitle和onPageFinished兩者。我發現有時onPageFinished,如果你使用react-router或類似的東西,你將不會得到通知。 onReceivedTitle存在漏洞,正如@ michael-levy提到的。

-1
private WebViewClient mWvClient = new WebViewClient() { 

     @Override 
     public void doUpdateVisitedHistory(WebView view, String url, boolean isReload) { 

      String title = view.getTitle();//getTitle 
      super.doUpdateVisitedHistory(view, url, isReload); 
     } 
    } 
+0

此類型可以通過ajax請求獲取標題 – Tamic

0

,如果你不希望整個標題,只是一個域名,就像如果你想要什麼,以顯示在www.google.com上只有「谷歌」,你必須在這個標題的所有查詢參數。

URL hostUrl= new URL(webView.getUrl()); 
    String title = hostUrl.getHost(); 
    title = title.startsWith("www.") ? title.substring(4) : title; 
相關問題