阻止WebView显示"网页不可用"

JoJ*_*oJo 84 java android

我有一个广泛使用WebView的应用程序.当此应用程序的用户没有Internet连接时,会出现"网页不可用"和其他各种文本的页面.有没有办法在我的WebView中不显示这个通用文本?我想提供自己的错误处理.

private final Activity activity = this;

private class MyWebViewClient extends WebViewClient
 public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
  // I need to do something like this:
  activity.webView.wipeOutThePage();
  activity.myCustomErrorHandling();
  Toast.makeText(activity, description, Toast.LENGTH_LONG).show();
 }
}
Run Code Online (Sandbox Code Playgroud)

我发现WebView-> clearView实际上并没有清除视图.

Sno*_*uin 93

首先用HTML创建自己的错误页面并将其放在资源文件夹中,我们称之为myerrorpage.html然后使用onReceivedError:

mWebView.setWebViewClient(new WebViewClient() {
    public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
        mWebView.loadUrl("file:///android_asset/myerrorpage.html");

    }
});
Run Code Online (Sandbox Code Playgroud)

  • 旧的"未加载网页"错误页面在被资产的自定义错误页面替换之前显示了几分之一秒 (20认同)
  • 1.您可以在WebView不可见的情况下加载Web内容(并且可能显示不良的进度)并在页面加载成功时显示它/加载"myerrorpage.html"时出错.2.您应该知道,如果加载在页面加载后运行的JS中的OR问题(例如在document.ready()事件中运行的jQuery函数),则会触发onReceiveError.桌面浏览器 - 将允许JS错误,而不会像移动浏览器那样通知用户. (3认同)
  • 添加`view.loadUrl("about:blank");`在loadUrl之前`以防止它在几分之一秒内显示错误页面. (3认同)
  • 同意奇努的观点。必须有更好的解决方案。 (2认同)
  • 把那个 myerrorpage.html 文件放在哪里?那个 android assets 文件夹在哪里? (2认同)

7he*_*ing 29

我找到的最佳解决方案是在OnReceivedError事件中加载一个空页面,如下所示:

@Override
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
    super.onReceivedError(view, errorCode, description, failingUrl);

    view.loadUrl("about:blank");
}
Run Code Online (Sandbox Code Playgroud)

  • 请注意,如果要处理`webView.goBack()`,请确保处理此空白页的条件。否则,将加载上一页,如果再次失败,则将再次看到该空白页。 (2认同)

cmc*_*nce 9

最后,我解决了这个问题.(它一直工作到现在..)

我的解决方案是这样的......

  1. 准备布局以显示何时发生错误而不是网页(脏页'未找到消息')布局有一个按钮,"RELOAD"带有一些指导消息.

  2. 如果发生错误,请记住使用布尔值并显示我们准备的布局.

  3. 如果用户单击"RELOAD"按钮,则将mbErrorOccured设置为false.并将mbReloadPressed设置为true.
  4. 如果mbErrorOccured为false且mbReloadPressed为true,则表示webview加载页面成功.'如果再次发生错误,mbErrorOccured将在onReceivedError(...)上设置为true

这是我的完整资料来源.看一下这个.

public class MyWebViewActivity extends ActionBarActivity implements OnClickListener {

    private final String TAG = MyWebViewActivity.class.getSimpleName();
    private WebView mWebView = null;
    private final String URL = "http://www.google.com";
    private LinearLayout mlLayoutRequestError = null;
    private Handler mhErrorLayoutHide = null;

    private boolean mbErrorOccured = false;
    private boolean mbReloadPressed = false;

    @SuppressLint("SetJavaScriptEnabled")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_webview);

        ((Button) findViewById(R.id.btnRetry)).setOnClickListener(this);
        mlLayoutRequestError = (LinearLayout) findViewById(R.id.lLayoutRequestError);
        mhErrorLayoutHide = getErrorLayoutHideHandler();

        mWebView = (WebView) findViewById(R.id.webviewMain);
        mWebView.setWebViewClient(new MyWebViewClient());
        WebSettings settings = mWebView.getSettings();
        settings.setJavaScriptEnabled(true);
        mWebView.setWebChromeClient(getChromeClient());
        mWebView.loadUrl(URL);
    }

    @Override
    public boolean onSupportNavigateUp() {
        return super.onSupportNavigateUp();
    }

    @Override
    public void onClick(View v) {
        int id = v.getId();

        if (id == R.id.btnRetry) {
            if (!mbErrorOccured) {
                return;
            }

            mbReloadPressed = true;
            mWebView.reload();
            mbErrorOccured = false;
        }
    }

    @Override
    public void onBackPressed() {
        if (mWebView.canGoBack()) {
            mWebView.goBack();
            return;
        }
        else {
            finish();
        }

        super.onBackPressed();
    }

    class MyWebViewClient extends WebViewClient {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            return super.shouldOverrideUrlLoading(view, url);
        }

        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            super.onPageStarted(view, url, favicon);
        }

        @Override
        public void onLoadResource(WebView view, String url) {
            super.onLoadResource(view, url);
        }

        @Override
        public void onPageFinished(WebView view, String url) {
            if (mbErrorOccured == false && mbReloadPressed) {
                hideErrorLayout();
                mbReloadPressed = false;
            }

            super.onPageFinished(view, url);
        }

        @Override
        public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
            mbErrorOccured = true;
            showErrorLayout();
            super.onReceivedError(view, errorCode, description, failingUrl);
        }
    }

    private WebChromeClient getChromeClient() {
        final ProgressDialog progressDialog = new ProgressDialog(MyWebViewActivity.this);
        progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        progressDialog.setCancelable(false);

        return new WebChromeClient() {
            @Override
            public void onProgressChanged(WebView view, int newProgress) {
                super.onProgressChanged(view, newProgress);
            }
        };
    }

    private void showErrorLayout() {
        mlLayoutRequestError.setVisibility(View.VISIBLE);
    }

    private void hideErrorLayout() {
        mhErrorLayoutHide.sendEmptyMessageDelayed(10000, 200);
    }

    private Handler getErrorLayoutHideHandler() {
        return new Handler() {
            @Override
            public void handleMessage(Message msg) {
                mlLayoutRequestError.setVisibility(View.GONE);
                super.handleMessage(msg);
            }
        };
    }
}
Run Code Online (Sandbox Code Playgroud)

另外:这是布局....

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/rLayoutWithWebView"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<WebView
    android:id="@+id/webviewMain"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

<LinearLayout
    android:id="@+id/lLayoutRequestError"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_centerInParent="true"
    android:background="@color/white"
    android:gravity="center"
    android:orientation="vertical"
    android:visibility="gone" >

    <Button
        android:id="@+id/btnRetry"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:minWidth="120dp"
        android:text="RELOAD"
        android:textSize="20dp"
        android:textStyle="bold" />
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)


Tor*_*rid 6

查看Android WebView onReceivedError()上的讨论.这很长,但共识似乎是a)你无法阻止"网页不可用"页面出现,但b)你总是在得到onReceivedError之后加载一个空页面


Jee*_*van 5

当webview嵌入某些自定义视图中时,用户几乎认为他正在看到本机视图而不是webview,在这种情况下显示"页面无法加载"错误是荒谬的.在这种情况下我通常做的是加载空白页面并显示如下的Toast消息

webView.setWebViewClient(new WebViewClient() {

            @Override
            public void onReceivedError(WebView view, int errorCode,
                    String description, String failingUrl) {
                Log.e(TAG," Error occured while loading the web page at Url"+ failingUrl+"." +description);     
                view.loadUrl("about:blank");
                Toast.makeText(App.getContext(), "Error occured, please check newtwork connectivity", Toast.LENGTH_SHORT).show();
                super.onReceivedError(view, errorCode, description, failingUrl);
            }
        });
Run Code Online (Sandbox Code Playgroud)