2010-11-04 11 views
16

He creado un diseño WebView, que se utiliza para acceder a un sitio web específico; sin embargo, sería útil editar o crear un recurso personalizado "Web page no disponible" cuando un teléfono no tiene una conexión de red o la página se agota. Sé que es posible porque si se abre la aplicación "Wikidroid" mientras que un teléfono está en modo avión recibe "artículo no está disponible" página de error en lugar de la "página Web no disponible" estándar de Android página de error .¿Cómo editar o crear una página de error personalizada para WebView?

Tengo la búsqueda alta y baja en internet y no he encontrado ningún recurso en línea que responda a esta solicitud. Cualquier ayuda es muy apreciada. Gracias por adelantado.

Respuesta

19

Para determinar cuándo el dispositivo tiene una conexión de red, solicite el permiso <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> y luego puede verificar con el siguiente código. Primero defina estas variables como variables de clase.

private Context c; 
private boolean isConnected = true; 

En el método initialize onCreate()c = this;

A continuación, comprobar si hay conectividad.

ConnectivityManager connectivityManager = (ConnectivityManager) 
    c.getSystemService(Context.CONNECTIVITY_SERVICE); 
if (connectivityManager != null) { 
    NetworkInfo ni = connectivityManager.getActiveNetworkInfo(); 
    if (ni.getState() != NetworkInfo.State.CONNECTED) { 
     // record the fact that there is not connection 
     isConnected = false; 
    } 
} 

A continuación, para interceptar el WebView requets, se podría hacer algo como lo siguiente. Si usa esto, probablemente desee personalizar los mensajes de error para incluir parte de la información disponible en el método onReceivedError.

final String offlineMessageHtml = "DEFINE THIS"; 
final String timeoutMessageHtml = "DEFINE THIS"; 

WebView browser = (WebView) findViewById(R.id.webview); 
browser.setNetworkAvailable(isConnected); 
browser.setWebViewClient(new WebViewClient() { 
    @Override 
    public boolean shouldOverrideUrlLoading(WebView view, String url) { 
     if (isConnected) { 
      // return false to let the WebView handle the URL 
      return false; 
     } else { 
      // show the proper "not connected" message 
      view.loadData(offlineMessageHtml, "text/html", "utf-8"); 
      // return true if the host application wants to leave the current 
      // WebView and handle the url itself 
      return true; 
     } 
    } 
    @Override 
    public void onReceivedError (WebView view, int errorCode, 
     String description, String failingUrl) { 
     if (errorCode == ERROR_TIMEOUT) { 
      view.stopLoading(); // may not be needed 
      view.loadData(timeoutMessageHtml, "text/html", "utf-8"); 
     } 
    } 
}); 
+0

Eché un vistazo a los errores que mencionas y actualicé mi respuesta para abordarlos. Es posible que desee familiarizarse con Java antes de ir demasiado lejos con un proyecto de Android. Una buena base de Java ayudará inmensamente a la depuración de estos pequeños errores y tratar de detectar problemas. Avíseme si encuentra otros problemas con esto. – Brian

+2

Brian, gracias por echar un vistazo al código. Agradezco enormemente su ayuda. Terminé usando el código "onReceivedError" y en lugar de cargar una cadena "timeoutMessageHtml", tengo la aplicación "setContentView()" en un nuevo diseño lineal que creé que tiene un mensaje de error personalizado. Además, estás 100% correcto con respecto a tener una buena base Java. He leído un par de libros de Java y actualmente estoy tomando una clase de Java, sin embargo, aprendo mejor al hacerlo, así que pensé qué mejor manera de aprender Java que crear una aplicación. Thx otra vez. –

+1

¡Me alegra ser una ayuda y estoy feliz de que funcione! – Brian

10

Marco W. es correcto.

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

    } 
}); 
+12

Esto no se verá bien en la mayoría de los dispositivos. La página de error estándar se representa antes de la llamada a onReceivedError(). Como resultado, la página de error estándar es visible durante un par de milisegundos hasta que se cargue la página personalizada. – Robert

0

He intentado utilizar todas las soluciones anteriores, pero ninguna de ellas está funcionando. Torcido mi código un poco y tengo la solución:

package com.samnjor.tipsmaster; 

import android.content.Context; import android.graphics.Bitmap; 
import android.net.ConnectivityManager; import 
android.net.NetworkInfo; import 
android.support.v7.app.AppCompatActivity; import android.os.Bundle; 
import android.view.View; import android.webkit.WebSettings; import 
android.webkit.WebView; import android.webkit.WebViewClient; import 
android.widget.ProgressBar; import android.widget.TextView; 

import com.google.android.gms.ads.AdListener; import 
com.google.android.gms.ads.AdRequest; import 
com.google.android.gms.ads.InterstitialAd; 

public class TodayTips extends AppCompatActivity { 
    String ShowOrHideWebViewInitialUse = "show"; 
    private WebView webview ; 
    private ProgressBar spinner; 
    private String TAG = TodayTips.class.getSimpleName(); 
    InterstitialAd mInterstitialAd; 
    final String noconnectionHtml = "Failed to connect ot the internet"; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_today_tips); 
     mInterstitialAd = new InterstitialAd(this); 

     // set the ad unit ID 
     mInterstitialAd.setAdUnitId(getString(R.string.adbig)); 

     AdRequest adRequest = new AdRequest.Builder() 
       .build(); 

     // Load ads into Interstitial Ads 
     mInterstitialAd.loadAd(adRequest); 

     mInterstitialAd.setAdListener(new AdListener() { 
      public void onAdLoaded() { 
       showInterstitial(); 
      } 
     }); 
    } 

    private void showInterstitial() { 
     if (mInterstitialAd.isLoaded()) { 
      mInterstitialAd.show(); 
     } 

     webview =(WebView)findViewById(R.id.webView); 
     spinner = (ProgressBar)findViewById(R.id.progressBar1); 
     webview.setWebViewClient(new CustomWebViewClient()); 

     webview.getSettings().setJavaScriptEnabled(true); 
     webview.getSettings().setDomStorageEnabled(true); 
     webview.setOverScrollMode(WebView.OVER_SCROLL_NEVER); 

     if(haveNetworkConnection()){ 
      webview.loadUrl("http://you domain here"); 
     } else { 


      webview.loadData(noconnectionHtml, "text/html", "utf-8"); // 
     } 
    } 
    private boolean haveNetworkConnection() { 
     boolean haveConnectedWifi = false; 
     boolean haveConnectedMobile = false; 

     ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
     NetworkInfo[] netInfo = cm.getAllNetworkInfo(); 

     for (NetworkInfo ni : netInfo) { 
      if (ni.getTypeName().equalsIgnoreCase("WIFI")) 
       if (ni.isConnected()) 
        haveConnectedWifi = true; 
      if (ni.getTypeName().equalsIgnoreCase("MOBILE")) 
       if (ni.isConnected()) 
        haveConnectedMobile = true; 
     } 
     return haveConnectedWifi || haveConnectedMobile; 

    } 

    // This allows for a splash screen 
    // (and hide elements once the page loads) 
    private class CustomWebViewClient extends WebViewClient { 

     @Override 
     public void onPageStarted(WebView webview, String url, Bitmap favicon) { 

      // only make it invisible the FIRST time the app is run 
      if (ShowOrHideWebViewInitialUse.equals("show")) { 
       webview.setVisibility(webview.INVISIBLE); 
      } 
     } 

     @Override 
     public void onPageFinished(WebView view, String url) { 

      ShowOrHideWebViewInitialUse = "hide"; 
      spinner.setVisibility(View.GONE); 

      view.setVisibility(webview.VISIBLE); 
      super.onPageFinished(view, url); 

     } 
    }`` } 
Cuestiones relacionadas