在goBack()之后从WebView历史获取Html页面的标题?

时间:2015-04-21 16:25:18

标签: android webview

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

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

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

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

}

1 个答案:

答案 0 :(得分: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
  4. 如果您使用Javascript更新页面标题,由于事件发生时间的原因,使用onPageFinished的行为可能与onReceivedTitle完全不同。