Android WebView渲染出现白屏问题

3
有时候,当我使用loadUrl加载网页时,网页不会显示出来,直到我触摸屏幕或滚动页面。
这就像是webview的绘制问题。
            Context context = ctx;
        final Dialog dialog = new Dialog(context);
            dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
            dialog.setContentView(R.layout.website);
            WebView webView = (WebView) dialog.findViewById(R.id.weburl);
            webView.setScrollbarFadingEnabled(false);  
            //Disable the horizontal scroll bar  
            webView.setHorizontalScrollBarEnabled(false);  
            //Enable JavaScript  
            webView.getSettings().setJavaScriptEnabled(true);  
            //Set the user agent  
            webView.getSettings().setUserAgentString("AndroidWebView");  
            //Clear the cache  
            webView.clearCache(true);  


            webView.loadUrl("http://" + WebUrl);
            webView.setWebViewClient(new WebViewClient() {
                public boolean shouldOverrideUrlLoading(WebView view, String url){
                    // do your handling codes here, which url is the requested url
                    // probably you need to open that url rather than redirect:
                    view.loadUrl(url);
                    view.setVisibility(View.VISIBLE);
                    return false; // then it is not handled by default action
               }

                @Override
                public void onPageFinished(WebView view, String url) {
                    view.refreshDrawableState();
                    Log.v("FINISH","FINISH");
                }


            });

有人知道我遇到这种问题的原因吗?

1
在 WebViewClient() 中,我认为你应该 return true;,因为你的宿主应用程序(视图)会处理 url - bgs
@Jean-Francois,可以发布您的完整代码吗? - Never Quit
可能是您正在加载的网站出了问题吗?如果不涉及隐私问题,请展示URL。 - Sherif elKhatib
是的,如果您可以发布完整的代码,我们可以使用它来尝试复制问题,这肯定会有助于故障排除。 正如之前提到的,如果它发生在特定的URL上,了解这一点会很有帮助,如果可能的话,请告诉我们哪些URL。 - hBrent
使用上述代码测试,它能正常工作。请问您的测试环境中有活跃的互联网连接吗? - Vishal Pawar
3个回答

2

在您的布局中使 WebView 不可见:

<WebView
    ...
    android:visibility="invisible"
    .../>

现在,在第一次发生onPageFinished时将其显示出来:

webView.setWebViewClient(new WebViewClient() {
    @Override
    public void onPageFinished(WebView view, String url) {
        if (webView.getVisibility() != View.VISIBLE) {
            webView.setVisibility(View.VISIBLE);
        }
    }
});

2
您正在测试哪个版本的Android?在Android 4.1之前的版本中,WebViews有时会出现这种问题。
将以下内容添加到该Activity的清单中即可解决此问题:
android:hardwareAccelerated="false"

1
禁用硬件加速不是一个好的选择。 - Divam Gupta

0

我不确定,我没有整个代码,但我认为与在此函数中实现的webViewClient有关:

public boolean shouldOverrideUrlLoading(WebView view, String url){
    // do your handling codes here, which url is the requested url
    // probably you need to open that url rather than redirect:
    view.loadUrl(url);
    view.setVisibility(View.VISIBLE);
    return false; // then it is not handled by default action
}

这是官方定义:

public boolean shouldOverrideUrlLoading (WebView view, String url)

在不实现 shouldOverrideUrlLoading 或将其设置为 return true 的情况下,尝试使用您的代码进行测试。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接