【问题标题】:Issue in WebView Android History When update Chrome stable version 63更新 Chrome 稳定版 63 时 WebView Android 历史记录中的问题
【发布时间】:2017-12-12 11:25:50
【问题描述】:

我的 Android 应用 webview 在 chrome 版本 61 或 62 上运行良好,但当我更新到版本 63 时。我的 webview 不存储历史记录,webView.canGoBack() 总是返回 false。但是以前版本的 chrome 可以正常工作。怎么解决?

【问题讨论】:

    标签: android google-chrome webview


    【解决方案1】:

    这个问题应该是铬的错误。我们在我们的应用程序中发现了同样的问题。这个问题的原因是我们在 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 ;
        }
    }
    

    【讨论】:

    • 我认为这与BUG有关。解决方法有效,已确认。用于添加带有loadUrl() 的附加标头。使用此解决方法无法做到这一点。
    【解决方案2】:

    即使我也面临这个问题。现在您可以在 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;
            }
    

    【讨论】:

    • 在我的例子中,不断地创造新的意图。
    猜你喜欢
    • 2014-06-10
    • 1970-01-01
    • 1970-01-01
    • 2011-04-02
    • 1970-01-01
    • 1970-01-01
    • 2014-12-19
    • 2012-01-04
    • 2013-10-22
    相关资源
    最近更新 更多