在我的应用程序中,有一个显示 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 应用程序通知标题的时间。我发现的是:
- WebChromeClient.onReceivedTitle 首先出现。但是,当使用 webView.goBack() 导航到页面时,不会发生此事件。
- 然后加载 html 页面并发生 DOM window.onload
- 最后出现 WebViewClient.onPageFinished
如果您使用 Javascript 更新页面标题,由于事件时间的原因,使用 onPageFinished 的行为可能与 onReceivedTitle 的行为完全不同。
关于android - 在 goBack() 之后从 WebView 历史中获取 Html 页面的标题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29777962/