在我的应用程序中,有一个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();
}
}
});
}
}
答案 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应用程序通知标题的时间。我发现的是:
如果您使用Javascript更新页面标题,由于事件发生时间的原因,使用onPageFinished的行为可能与onReceivedTitle完全不同。