如何解决WebView的白屏问题?

4

我正在使用以下代码来填充我的WebView与本地HTML文件,但在一些设备上看起来很好,但最近我注意到在一些设备上,如Colors X114WebView出现了一秒钟,然后一切都消失了,白色的空白屏幕出现。

代码:

package com.nepalpolice.mnemonics;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v7.app.AppCompatActivity;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;


/**
 * Created by Sagar on 2017/09/23. yo chai menupage ko Fragments ko lagi
 */

public class Homepage extends Fragment {

    WebView myWebView;
    private LinearLayout container;
    private Button nextButton, closeButton;
    private EditText findBox;


    public Homepage() {
        // Required empty public constructor
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View rootView = inflater.inflate(R.layout.fragment_homepage, container,  false);


        String url = getArguments().getString("url");


        myWebView=(WebView)rootView.findViewById(R.id.webview);
        myWebView.getSettings().setBuiltInZoomControls(true);

        myWebView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
        myWebView.getSettings().setLoadsImagesAutomatically(true);
        myWebView.getSettings().setJavaScriptEnabled(true);

        myWebView.getSettings().setBuiltInZoomControls(true);

        myWebView.setInitialScale(1);
        myWebView.getSettings().setLoadWithOverviewMode(true);
        myWebView.getSettings().setUseWideViewPort(true);

        WebSettings webSettings = myWebView.getSettings();

        myWebView.loadUrl(url);


        return rootView;


    }

    public static String changedHeaderHtml(String htmlText) {

        String head = "<head><meta name=\"viewport\" content=\"width=device-width, user-scalable=yes\" /></head>";

        String closedTag = "</body></html>";
        String changeFontHtml = head + htmlText + closedTag;
        return changeFontHtml;

    }
}

以下是它应该显示的样子:

输入图像描述

但在某些设备上它的显示效果不同。

输入图像描述

我将url作为字符串传递,如下:

  args3.putString("url1", "file:///android_asset/b/dbpm.html");
6个回答

12

你可以尝试这个:

WebSettings settings = webView.getSettings();
settings.setJavaScriptEnabled(true);
settings.setAllowContentAccess(true);
settings.setDomStorageEnabled(true);
webView.setWebViewClient(new WebViewClient());
webView.loadUrl(url);

settings.setDomStorageEnabled(true);添加进来对我们有效。我们已经拥有其他的设置。 - Mike Flynn

6

很可能你已经遇到了视图层类型的问题。 尝试使用这段代码:

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    webSettings.setMixedContentMode(0);
    webView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
} else if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
    webView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
} else {
    webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
}

同时尝试在 Manifest 中设置硬件加速:

android:hardwareAccelerated="true"

请参考此链接以获取更多关于硬件加速技术的详细信息。

webView.setLayerType(View.LAYER_TYPE_HARDWARE, null); 解决了我的问题。 - bronze man

5

你需要在其中启用 JavaScriptEnabled,并且URL必须以http:开头。

wv1.getSettings().setLoadsImagesAutomatically(true);
wv1.getSettings().setJavaScriptEnabled(true);
wv1.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
wv1.loadUrl(url);

您可以在以下链接中获取基本信息: 这些链接提供了关于Android Web视图的基本信息。其中包括如何使用Web视图布局、如何创建自定义Web视图以及如何在应用程序中使用Web视图等相关内容。

我已经启用了JavaScript,并将URL设置为args3.putString("url1", "file:///android_asset/b/dbpm.html");。 - Rishiram Ranabhat
请分享您的URL,并尝试使用 setJavaScriptEnabled(true); 而不是 setJavaScriptCanOpenWindowsAutomatically(true); - Abhinav Gupta
我已经编辑了我的问题,是的,我在代码中都设置了setJavaScriptEnabled(true)和setJavaScriptCanOpenWindowsAutomatically(true)。 - Rishiram Ranabhat

1
我可以通过重写WebViewClient类来解决这个问题,只需要实现onPageFinished()方法,在页面加载进度完成时进行验证即可。
有时候页面的内容可能没有完全加载。只需不断刷新,直到达到100%。
while(view.getProgress() < 100) ()-> {view.reload()};

您需要实现类似超时验证的功能。

private class MyWebViewClient extends WebViewClient
{
   @Override
   public void onPageFinished(WebView view, String url)
   {
      try
      {
         while(view.getProgress() < 100)
         {
             view.reload();
         }
      }
      catch (Exception e)
      {
         e.printStackTrace();
      }
   }
}


0

我有一个关于我的网站的问题。所有应用程序请求都传递到 AJAX。

if(!empty($_SERVER['HTTP_X_REQUESTED_WITH'])')
{//the result is returned to the application}

然后我将请求更改为

if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest')
{//does not return to the application}

白屏问题已经解决,应用程序正在运行。


0
使您的Web视图的高度和宽度与父容器匹配
    <WebView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/webview"/>

这对我有用。

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