如何管理Android Webview的空白白色加载屏幕?

19

这更多是一种视觉问题而不是直接的问题,但当WebView在我的应用程序中加载时,屏幕会空白白2-4秒,直到内容完全加载。时间取决于正在加载的内容大小。

有没有办法管理这个问题,使屏幕仅在加载完毕后刷新到内容?类似于“正在加载…”动画或类似的东西吗?我不想向用户呈现纯白的屏幕。

我有一个启动画面,然后加载WebView。 WebView在那个初始的空白暂停(加载时)之后运作正常,但是我想将其保留在特定的屏幕上,直到页面加载完成或者有黑色屏幕和进度加载器。

是否有检测负载完成的方法?如果是这样,我可以将其用作触发器。

有人知道如何管理这个空白白屏幕吗?

谢谢!

/ r

9个回答

34

你可以选择将webview设置为透明:

webview.setBackgroundColor(0x00000000); 

这就是为我解决问题的香甜佳酿。 - Alfie Hanssen
8
在XML中添加android:background="@android:color/transparent"没有任何效果。使用webView.setBackgroundColor(Color.TRANSPARENT)可以达到目的。 - Steve Blackwell
这样做不会让应用程序在 URL 加载完成之前看起来像是冻结了几秒钟吗? - NullByte08

8

将这段代码放在 onCreate 中即可。

               ProgressDialog _dialog ;                   
               my_web_view.setWebViewClient(new WebViewClient(){


       @Override
       public void onPageStarted(WebView view, String url, Bitmap favicon) {
        // TODO Auto-generated method stub
        _dialog =ProgressDialog.show(Store_locator.this, "", "Please wait...");
        super.onPageStarted(view, url, favicon);
       }
       @Override
       public void onPageFinished(WebView view, String url) {
        // TODO Auto-generated method stub
        super.onPageFinished(view, url);
        _dialog.dismiss();
       }

       @Override
       public void onReceivedError(WebView view, int errorCode,
         String description, String failingUrl) {
        // TODO Auto-generated method stub
        super.onReceivedError(view, errorCode, description, failingUrl);
        try{
         _dialog.dismiss();
        }catch (Exception e) {
         // TODO: handle exception
        }
       }

      });

对我来说没有起作用 - onPageFinished 回调得太早了,所以这 2-4 秒的白屏仍然没有被修复。 - Vadim

2
这个问题并没有一个好的答案。你想要的是,就像普通浏览器一样,webview会显示当前内容,直到新内容被加载……但它不会这样做。
你可以展示加载动画,但这仍然不是很好的用户体验。如果你制作一个全屏类型的动画,用户会看到闪烁的屏幕,这会让人感到不适。如果你在页面顶部/底部制作一个类似于浏览器的进度条,因为页面的大部分仍然是白色,所以看起来很奇怪。

0

在Web View中加载URL - Kotlin

请查看以下代码,它会有所帮助:

WebViewActivity.kt

class WebViewActivity : AppCompatActivity() {
private lateinit var webView: WebView
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_web_view)
    initView()
    loadData()
}

@SuppressLint("SetJavaScriptEnabled")
private fun loadData() {
    webView.settings.domStorageEnabled = true
    webView.isHorizontalScrollBarEnabled = true
    webView.settings.javaScriptEnabled = true
    webView.settings.setSupportZoom(true)
    webView.settings.builtInZoomControls = true
    webView.requestFocus()
    webView.webViewClient = AppWebViewClients()
    webView.settings.setSupportMultipleWindows(true)
    val url = "https://www.africau.edu/images/default/sample.pdf"
    webView.loadUrl("http://docs.google.com/gview?embedded=true&url=$url")
}

class AppWebViewClients : WebViewClient() {
    @Deprecated("Deprecated in Java")
    override fun shouldOverrideUrlLoading(view: WebView, url: String): Boolean {
        view.loadUrl(url)
        return true
    }

    override fun onPageCommitVisible(view: WebView?, url: String?) {
        super.onPageCommitVisible(view, url)
    }

    override fun shouldOverrideUrlLoading(
        view: WebView?,
        request: WebResourceRequest?
    ): Boolean {
        return super.shouldOverrideUrlLoading(view, request)
    }
}

private fun initView() {
    webView = findViewById(R.id.web_view)
}

AndroidManifest.xml

<uses-permission android:name="android.permission.INTERNET" />

0

webView.setBackgroundColor(Color.TRANSPARENT) 可以去除 WebView 的白屏问题。


0

谢谢 - 很好的开始。我之前用了错误的关键词搜索! - Robbe
有时,即使页面没有完全渲染,onPageFinished也会被调用,因此您可能会在webview上获得空白屏幕。为了显示进度对话框,直到页面完全呈现,您必须使用onLoadResource并检查页面的进度。请查看此答案https://dev59.com/P2855IYBdhLWcg3wg0nC#31537328。 - John

0

我也遇到同样的问题,当我在webView.setWebViewClient中添加下面的代码后,问题就解决了。

@SuppressLint("WebViewClientOnReceivedSslError")
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
    handler.proceed(); // Ignore SSL certificate errors
}

0
webview.setBackgroundColor(0x00000000);

对我有用

例如:我使用我的颜色代码6424633(十六进制代码为#620839,用于红色背景),而不是0x00000000

因此,当启动屏幕意图打开主活动时,不会显示白色空白屏幕,而是显示红色背景,并且当Webview加载URL时,它将消失。


0

为了解决空白白屏问题,您可以在布局XML中设置适当的背景颜色(不是白色),在布局XML文件中将Webview的可见性设置为gone,并添加一个Webviewclient。每当URL加载完成时,将Webview的可见性设置为visible。


            public void onPageFinished(WebView view, String url) {
                // do your stuff here
                webView.setVisibility(View.VISIBLE);
            }
        });

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