【发布时间】:2017-12-12 11:25:50
【问题描述】:
我的 Android 应用 webview 在 chrome 版本 61 或 62 上运行良好,但当我更新到版本 63 时。我的 webview 不存储历史记录,webView.canGoBack() 总是返回 false。但是以前版本的 chrome 可以正常工作。怎么解决?
【问题讨论】:
标签: android google-chrome webview
我的 Android 应用 webview 在 chrome 版本 61 或 62 上运行良好,但当我更新到版本 63 时。我的 webview 不存储历史记录,webView.canGoBack() 总是返回 false。但是以前版本的 chrome 可以正常工作。怎么解决?
【问题讨论】:
标签: android google-chrome webview
这个问题应该是铬的错误。我们在我们的应用程序中发现了同样的问题。这个问题的原因是我们在 shouldOverrideUrlLoading 方法中调用了 Webview 的 loadUrl 方法,当我们这样做时,webview 不能在某些版本的 chromium 中返回。下面的代码是我的解决方法:
public class WebViewBugFixDemo extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// todo : set your content layout
final WebView webView = (WebView) findViewById(R.id.webview);
final String indexUrl = "http://www.yourhost.com";
final String indexHost = Uri.parse(indexUrl).getHost();
webView.loadUrl(indexUrl);
webView.setWebViewClient(new WebViewClient() {
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (isSameWithIndexHost(url, indexHost)) {
return false;
}
view.loadUrl(url);
return true;
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && request != null && request.getUrl() != null) {
String url = request.getUrl().toString();
if (isSameWithIndexHost(url, indexHost)) {
return false;
}
view.loadUrl(url);
return true;
}
return super.shouldOverrideUrlLoading(view, request);
}
});
}
/**
* if the loadUrl's host is same with your index page's host, DON'T LOAD THE URL YOURSELF !
* @param loadUrl the new url to be loaded
* @param indexHost Index page's host
* @return
*/
private boolean isSameWithIndexHost(String loadUrl, String indexHost) {
if (TextUtils.isEmpty(loadUrl)) {
return false ;
}
Uri uri = Uri.parse(loadUrl) ;
Log.e("", "### uri " + uri) ;
return uri != null && !TextUtils.isEmpty(uri.getHost()) ? uri.getHost().equalsIgnoreCase(indexHost) : false ;
}
}
【讨论】:
loadUrl() 的附加标头。使用此解决方法无法做到这一点。
即使我也面临这个问题。现在您可以在 ouldOverrideUrlLoading(WebView view, String url){} 函数中使用意图,而 super.onbackpressed() 将完成其维护历史记录的工作。
public boolean shouldOverrideUrlLoading(WebView view, String url) {
Intent intent = new Intent(MainActivity.this, MainActivity.class);
intent.putExtra("postUrl", url);
startActivity(intent);
return true;
}
【讨论】: