2010-11-04 16 views
16

Ho creato un layout WebView, utilizzato per accedere a un sito Web specifico, tuttavia sarebbe utile modificare o creare una "pagina Web non disponibile" "risorsa quando un telefono non ha una connessione di rete o il pagina scaduta. So che è possibile, perché se si apre l'applicazione "Wikidroid", mentre un portatile è in modalità aereo si riceve "articolo non disponibili" pagina di errore al posto della "pagina di web mancante" Android standard di pagina di errore .Come modificare o creare una pagina di errore personalizzata per WebView?

Ho una ricerca di alta e bassa su Internet e non ho trovato nessuna risorsa online che risponde a questa richiesta. Qualsiasi aiuto è molto apprezzato. Grazie in anticipo.

risposta

19

Per determinare quando il dispositivo ha una connessione di rete, richiedere l'autorizzazione <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> e quindi è possibile verificare con il codice seguente. Prima definisci queste variabili come variabili di classe.

private Context c; 
private boolean isConnected = true; 

nel metodo onCreate() inizializzare c = this;

Poi verificare la connettività.

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; 
    } 
} 

Poi per intercettare il WebView requets, si potrebbe fare qualcosa di simile a quanto segue. Se lo si utilizza, è probabile che si desideri personalizzare i messaggi di errore per includere alcune delle informazioni disponibili nel metodo 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

Ho dato un'occhiata agli errori che hai citato e ho aggiornato la mia risposta per affrontarli. Potresti voler familiarizzare con Java prima di andare troppo lontano con un progetto Android. Una buona base Java aiuterà enormemente nel debugging di questi piccoli errori e nel tentativo di individuare i problemi. Fammi sapere se incontri altri problemi con questo. – Brian

+2

Brian, grazie per dare un'occhiata al codice, GRAZIE di apprezzare la tua assistenza. Ho finito per utilizzare il codice "onReceivedError" e invece di caricare una stringa "timeoutMessageHtml", ho l'app "setContentView()" in un nuovo layout lineare che ho creato che ha un messaggio di errore personalizzato. Inoltre, sei corretto al 100% per avere una buona base Java. Ho letto un paio di libri in Java e attualmente sto prendendo una lezione di Java, tuttavia apprendo meglio, quindi ho capito quale modo migliore per imparare Java rispetto alla creazione di un'app. Di nuovo. –

+1

Sono felice di essere d'aiuto e felice che tu abbia funzionato! – Brian

10

Marco W. è corretto.

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

La maggior parte dei dispositivi non ha un bell'aspetto.La pagina di errore standard viene visualizzata prima della chiamata a onReceivedError(). Di conseguenza, la pagina di errore standard è visibile per un paio di millisecondi finché non viene caricata la pagina personalizzata. – Robert

0

Ho provato a utilizzare tutte le soluzioni di cui sopra ma nessuna funziona. Ritorto un po 'il mio codice e ho trovato la soluzione:

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); 

     } 
    }`` } 
Problemi correlati