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

标签 android webview

在我的应用程序中,有一个显示 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();
                }
            }
        });
    }

}

最佳答案

显然,这是一个 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 的行为完全不同。

关于android - 在 goBack() 之后从 WebView 历史中获取 Html 页面的标题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29777962/

相关文章:

java - 如何重用一个 Intent 并将其带到最前面?

android - 代码完成不适用于外部库 XML 属性 (Android Studio)

Swift 4 从 Subview 回来

javascript - 如何获取 Android WebView 中从顶部到 div block 的像素数量?

android - "The most simple Android project has the following build.gradle"

android - 新的 android 支持设计库,屏幕外滚动 tablayout 不工作

ios - UIWebView request.response = nil 问题

objective-c - WebView选择变化的通知

javascript - Android Webview - javascript 屏幕尺寸与实际屏幕尺寸

android - 当 FAB 重力处于底部时,Circular Reveal 不起作用