2011-11-19 27 views
34

Tôi đang sử dụng WebView trong ứng dụng của mình, tôi có yêu cầu thay đổi tiêu đề ứng dụng dựa trên người dùng trang đang bật. Làm thế nào tôi có thể làm điều này trong Android WebView?Cách tải tiêu đề trang web đã tải trong Android WebView?

Tôi đã làm điều này trong iphone bằng cách làm theo dòng

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()); 
      } 

     }); 

    } 

Trả lời

74

Bạn sẽ phải sử dụng một WebViewClient tùy chỉnh để thực hiện điều này. Bạn sẽ ghi đè lên phương thức onPageFinished() để khi một trang mới kết thúc tải, bạn có thể đặt chế độ xem web thành tiêu đề phù hợp.

Dưới đây là một việc thực hiện mẫu trên:

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

Bạn đang một sẽ làm điều đó nơi bạn đang khởi webview của bạn. Thay thế "ExperimentingActivity" thành tên của bất kỳ hoạt động nào của bạn.

Nếu bạn đã ghi đè WebViewClient, chỉ cần thêm hàm này hoặc mã bên trong vào hàm hiện có của bạn.

Bạn có thể nhận được thông tin thêm về các lớp học và chức năng Tôi đang sử dụng ở đây tại địa chỉ:

Android Developers: Activity - setTitle()

Android Developers: WebViewClient

Android Developers: WebView

+0

Chắc chắn, không sao. Chỉ cần xem qua các liên kết tài liệu tôi đã đăng và bạn sẽ nắm bắt được những thứ bạn có thể làm với lớp WebView và WebViewClient. Nó có thể trông phức tạp lúc đầu nhưng nó cung cấp cho bạn rất nhiều tính linh hoạt. – DallaRosa

+0

Điều này có hiệu quả, cảm ơn sự giúp đỡ. – Sam

+0

tôi có thể đọc giá trị nhưng khi tôi đặt giá trị không hiển thị trong tiêu đề ứng dụng, tôi đã cập nhật câu hỏi với triển khai chế độ xem web của tôi.hãy giúp – Sam

38

quan sát của tôi là, bạn sẽ có được danh hiệu trang web sử dụng WebChromeClient trong thời gian ít hơn so với sử dụng WebViewClient

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 cho giải pháp thanh lịch – Abhijit

+3

Giải pháp tuyệt vời. Làm việc cho nhiều người. Cảm ơn nhiều. – Tony

+2

Điều này dường như không được gọi sau khi WebView.goBack() được gọi. Vì vậy, nếu bạn cần phải xử lý điều hướng trở lại tôi nghĩ rằng onPageFinished() có thể là một lựa chọn tốt hơn. –

0

Vì vậy, kinh nghiệm của tôi bạn nên sử dụng onReceivedTitle và onPageFinished cả hai. Tôi thấy rằng đôi khi onPageFinished bạn sẽ không nhận được thông báo nếu bạn kết thúc trước bằng cách sử dụng phản ứng-router hoặc một cái gì đó tương tự. Và onReceivedTitle có lỗi như @ michael-levy đã đề cập.

-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

Loại này có thể Nhận tiêu đề theo yêu cầu ajax – Tamic

0

Điều gì xảy ra nếu bạn không muốn toàn bộ tiêu đề và chỉ tên miền, như bạn muốn chỉ hiển thị 'Google' từ www.google.com và bạn có tất cả tham số truy vấn trong tiêu đề này .

URL hostUrl= new URL(webView.getUrl()); 
    String title = hostUrl.getHost(); 
    title = title.startsWith("www.") ? title.substring(4) : title; 
Các vấn đề liên quan