【问题标题】:How to get loaded web page title in Android WebView?如何在 Android WebView 中获取加载的网页标题?
【发布时间】:2011-11-19 09:56:59
【问题描述】:

我在我的应用程序中使用 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());
            }

        });

    }

【问题讨论】:

    标签: android android-webview


    【解决方案1】:

    您必须使用自定义 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());
            }
        });
    

    您将在初始化 webview 的地方执行此操作。 将“ExperimentingActivity”替换为您的活动名称。

    如果您已经覆盖了 WebViewClient,只需将此函数或其中的代码添加到您已经存在的函数中即可。

    您可以在此处获取有关我正在使用的类和函数的更多信息:

    Android Developers: Activity - setTitle()

    Android Developers: WebViewClient

    Android Developers: WebView

    【讨论】:

    • 当然,没问题。只需查看我发布的文档链接,您就会了解可以使用 WebView 类和 WebViewClient 执行的操作。起初它可能看起来很复杂,但它为您提供了很大的灵活性。
    • 我可以读取该值,但是当我设置它未显示在应用标题中的值时,我已使用我的 Web 视图实现更新问题。请帮助
    • 看看你的代码。加载页面后,您正在设置自定义 webviewclient 和自定义 webchromeclient。您必须移动“mWebView.loadUrl(url);”行到 onCreate 方法的末尾(或至少在设置 webviewclient 和 webchromeclient 之后)以使这些设置生效
    【解决方案2】:

    我的观察是,使用WebChromeClient 获得网页标题的时间比使用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);
            }
        }
    });
    

    【讨论】:

    • 这似乎没有在调用 WebView.goBack() 之后被调用。因此,如果您需要处理后退导航,我认为 onPageFinished() 可能是更好的选择。
    • code.google.com/p/android/issues/detail?id=66337。看起来 onReceivedTitle() 行为在某些 Android 版本中被破坏了。
    【解决方案3】:

    在 Kotlin 中读取页面标题的最简单方法:

          webView.webViewClient = object : WebViewClient() {
             //....
              override fun onPageFinished(view: WebView, url: String) {
               val title = view.title
                }
               //...
              }
    

    【讨论】:

      【解决方案4】:
      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);
              }
          }
      

      【讨论】:

      • 该类型可以通过ajax请求获取Title
      【解决方案5】:

      所以根据我的经验,您应该同时使用 onReceivedTitle 和 onPageFinished。我发现有时 onPageFinished 如果您在前端使用 react-router 或类似的东西,您将不会收到通知。正如@michael-levy 提到的那样,onReceivedTitle 存在缺陷。

      【讨论】:

        【解决方案6】:

        如果您不想要整个标题,而只想要一个域名怎么办,例如,如果您只想显示 www.google.com 中的“Google”,并且您在该标题中拥有所有查询参数。

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

        【讨论】:

          【解决方案7】:

          从 webview 获取图片和标题

          图片

          img.setImageBitmap(webview1.getFavicon());

          标题

          txt.setText(webview1.getTitle());

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-08-30
            相关资源
            最近更新 更多