【问题标题】:Get the Title for an Html page from WebView History after goBack()?goBack() 之后从 WebView 历史记录中获取 Html 页面的标题?
【发布时间】:2015-06-28 22:53:34
【问题描述】:

在我的应用程序中有一个显示 Html 内容的 WebView 和一个后退按钮,让用户在浏览器历史记录中导航。在 WebChromeClient 中,我在 onReceivedTitle() 中获取 Html 页面标题并将其显示在我的应用中。

向用户显示第一页并显示第一页标题。然后,用户可以单击 Html 中的超链接以进入下一页。第二页有一个不同的标题,这是正确显示的。问题是,如果用户单击“后退”按钮,则从历史记录中显示第一页,但不会再次调用 onReceivedTitle()。所以我的第一页显示第二页的标题错误。

如何获取通过调用 goBack() 加载的页面的标题?

这里有一些简化的代码来演示。想象一个带有 TextView、WebView 和 Button 的布局。另外,想象一下 assets 文件夹中有两个 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();
                }
            }
        });
    }

}

【问题讨论】:

  • 你可以获取 webview 并调用 webView.getTitle();
  • 是的,但在什么情况下? onPageFinished() 可以用,但是之后 onReceivedTitle() 好像没用了。

标签: android webview


【解决方案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 有完全不同的行为,因为事件时间。

【讨论】:

    猜你喜欢
    • 2013-10-22
    • 2022-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-17
    • 1970-01-01
    • 1970-01-01
    • 2013-02-25
    相关资源
    最近更新 更多