Android Webview如果没有Internet错误自定义页面

问题描述 投票:0回答:1

**当没有互联网应用程序打开时,为我的应用程序启用WebView,并且在没有互联网错误时为他显示网站地址。我想打开HML页面,但即使我试图帮助谢谢你。

-----------------------------------------------------------------------------------------------------------**

example

java的

    package com.app.xxxx;

    import android.app.Activity;
    import android.content.ActivityNotFoundException;
    import android.content.Context;
    import android.content.Intent;
    import android.graphics.Bitmap;
    import android.net.ConnectivityManager;
    import android.net.NetworkInfo;
    import android.net.Uri;
    import android.support.v4.widget.SwipeRefreshLayout;
    import android.view.View;
    import android.webkit.DownloadListener;
    import android.webkit.WebResourceRequest;
    import android.webkit.WebSettings;
    import android.webkit.WebView;
    import android.webkit.WebViewClient;
    import android.widget.ProgressBar;

    public class WebviewInits {

WebView webView;
SwipeRefreshLayout swipeRefreshLayout;
ProgressBar progressBar;
Context context;

public WebviewInits(WebView webView, SwipeRefreshLayout swipeRefreshLayout, ProgressBar progressBar,Context context) {
this.webView = webView;
this.swipeRefreshLayout = swipeRefreshLayout;
this.progressBar = progressBar;
this.context=context;
}

public void initWeb(){
webView.getSettings().setJavaScriptEnabled( true );
webView.getSettings().setDomStorageEnabled(true);
webView.getSettings().setAppCachePath("caches");
webView.getSettings().setAppCacheEnabled(true);
webView.getSettings().setSavePassword(true);
webView.getSettings().setSaveFormData(true);
offlineLoad();//TODO Delete if you don't want offline load

webView.setDownloadListener(new DownloadListener() {
    @Override
    public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimetype, long contentLength) {
Uri uri = Uri.parse(url);
Intent intent = new Intent(Intent.ACTION_VIEW,uri);
context.startActivity(intent);
    }
});

swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
    @Override
    public void onRefresh() {
webView.loadUrl(webView.getUrl());
    }
});

webView.setWebViewClient(new WebViewClient(){
    @Override
    public void onPageStarted(WebView view, String url, Bitmap favicon) {
if (!swipeRefreshLayout.isRefreshing()){ //If you didn't refresh the page by using swiperefresh it will show progressbar.
    progressBar.setVisibility(View.VISIBLE);
}
super.onPageStarted(view, url, favicon);
    }

    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (url.startsWith("https://play.google.com/") || url.startsWith("http://play.google.com/")) {
    try {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse(url));
Activity host = (Activity) view.getContext();
host.startActivity(intent);
return true;
    } catch (ActivityNotFoundException e) {
// Google Play app is not installed, you may want to open the app store link
Uri uri = Uri.parse(url);
view.loadUrl("https://play.google.com/store/apps/" + uri.getHost() + "?" + uri.getQuery());
return false;
    }
}
return false;
    }

    @Override
    public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
return super.shouldOverrideUrlLoading(view, request);
    }

    @Override
    public void onPageFinished(WebView view, String url) {
progressBar.setVisibility(View.INVISIBLE); //It will hide progressbar because our page loaded.
if (swipeRefreshLayout.isRefreshing()){
    swipeRefreshLayout.setRefreshing(false); //This will hide swiperefresh icon if we refreshed.
}
super.onPageFinished(view, url);
    }
});webView.getSettings().setUseWideViewPort(true);
webView.getSettings().setLoadWithOverviewMode(true);
}
//TODO Offline Cache Load
public void offlineLoad(){
webView.getSettings().setAppCacheMaxSize( 5 * 1024 * 1024 ); // 5MB Size of storage that it will take
webView.getSettings().setAppCachePath( context.getApplicationContext().getCacheDir().getAbsolutePath() );
webView.getSettings().setAllowFileAccess( true );
webView.getSettings().setAppCacheEnabled( true );
webView.getSettings().setCacheMode( WebSettings.LOAD_DEFAULT ); // load online by default

if ( !WebviewInits.isNetworkAvailable(context) ) { // loading offline
    webView.getSettings().setCacheMode( WebSettings.LOAD_CACHE_ELSE_NETWORK );
}
} 
public static boolean isNetworkAvailable(Context context) {
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = cm.getActiveNetworkInfo();
// if no network is available networkInfo will be null
// otherwise check if we are connected
if (networkInfo != null && networkInfo.isConnected()) {
    return true;
}
return false;
}
    }
webview custom-error-pages
1个回答
0
投票

如果要在WebView中处理错误,则应根据以下代码覆盖onReceivedError,

private class MyWebViewClient extends WebViewClient {
.
.
.

   // api<23
   @Override
   public void onReceivedError(WebView view, int errorCode, String description, String url) {
        view.stopLoading();
        webview.loadUrl("file:///android_asset/error/error.html"); // load error page from asset folder

// handle error

    }

  // api> 23
  @Override
  @TargetApi(android.os.Build.VERSION_CODES.M) 
  public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
    view.stopLoading();
    webview.loadUrl("file:///android_asset/error/error.html"); // load error page from asset folder

// handle error

//          super.onReceivedError(view, request, error);
  }
.
.
.

}

另外,你可以检查shouldOverrideUrlLoading中的连接,如果没有连接加载错误页面,试试这个:

public boolean shouldOverrideUrlLoading(WebView view, String url) {


            if (!isNetworkAvailable(getApplicationContext())) {
                showCustomErrorPage();
                return true;
            }
.
.
.

}

showCustomErrorPage函数:

private void showCustomErrorPage() {

   webview.loadUrl("file:///android_asset/error/error.html");

}
© www.soinside.com 2019 - 2024. All rights reserved.