Android WebView中如何获取加载的网页标题?

问题描述 投票:0回答:8

我在应用程序中使用 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
8个回答
113
投票

您必须使用自定义 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 开发者:Activity - setTitle()

Android 开发者:WebViewClient

Android 开发者:WebView


53
投票

我的观察是,使用

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

3
投票

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

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

1
投票

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


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

1
投票

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

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

0
投票

从webview获取图像和标题

图片

img.setImageBitmap(webview1.getFavicon());

标题

txt.setText(webview1.getTitle());


0
投票

是的,WebChromeClient 的 onReceivedTitle 工作正常,但在 WebView.goBack() 之后不会调用。所以你可以尝试使用 WebView 历史记录来解决这个问题。

sealed interface TitleState {

    object Loading: TitleState

    data class Loaded(val title: String?): TitleState
}

private var titleState = TitleState.Loading

webView.webChromeClient = object : WebChromeClient() {

    override fun onReceivedTitle(view: WebView?, title: String?) {
       super.onReceivedTitle(view, title)

       titleState = TitleState.Loaded(title)
    }
}

webView.webViewClient = object : WebViewClient() {

    override fun onPageStarted(view: WebView, url: String, favicon: Bitmap?) {
        super.onPageStarted(view, url, favicon)

        val currentTitle = view.copyBackForwardList().currentItem?.title

        if (currentTitle.isNullOrBlank()) {
            titleState = TitleState.Loading
        } else {
            titleState = TitleState.Loaded(currentTitle)
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.