Verhindern, dass WebView "Web-Seite nicht verfügbar" anzeigt

Ich habe eine App, die umfangreiche Nutzung eines WebView. Wenn der Benutzer dieser App keine Internetverbindung hat, wird eine Seite mit der Bezeichnung "Webseite nicht verfügbar" und verschiedene andere Texte angezeigt. Gibt es eine Möglichkeit, diesen generischen Text in meinem WebView nicht zu zeigen? Ich möchte meine eigene Fehlerbehandlung anbieten.

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

Ich habe herausgefunden, WebView-> clearView nicht klar, die Ansicht.

  • Ist es möglich, auf Ressourcen in einem anderen APK zuzugreifen, ohne Content-Provider zu verwenden?
  • Wie zu stoppen / abbrechen Android CountDownTimer
  • Was passiert hinter den Kulissen, wenn ich eine Repo-Synchronisation mache?
  • Wie man einen Android-Benachrichtigungston spielt
  • Aapt nicht unter dem richtigen Weg gefunden
  • Wenn Sie den Screenshot programmgesteuert aufnehmen, wird der Inhalt von surfaceVIew nicht erfasst
  • Android: Wie man MICR-Codes erkennt
  • OnSaveInstanceState und Fragmente?
  • Adb emu Befehl funktioniert nicht manchmal
  • Wie benutzt man TabHost.OnTabChangeListener in Android?
  • Android und zeigt mehrsprachigen Text in einem TextView in einem TableRow
  • Platziere 3 Knöpfe in einem LinearLayout, um Platz zu nehmen
  • 15 Solutions collect form web for “Verhindern, dass WebView "Web-Seite nicht verfügbar" anzeigt”

    Zuerst erstellen Sie Ihre eigene Fehlerseite in HTML und legen Sie sie in Ihren Assets-Ordner, nennen wir es myerrorpage.html Dann mit onReceivedError:

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

    Die beste Lösung, die ich gefunden habe, ist, eine leere Seite in das OnReceivedError-Ereignis wie folgt zu laden:

     @Override public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { super.onReceivedError(view, errorCode, description, failingUrl); view.loadUrl("about:blank"); } 

    Schließlich habe ich das gelöst. (Es funktioniert bis jetzt ..)

    Meine Lösung ist so …

    1. Bereiten Sie das Layout vor, um zu zeigen, wann ein Fehler statt der Web-Seite aufgetreten ist (eine verschmutzte Seite nicht gefundene Nachricht). Das Layout hat eine Schaltfläche, "RELOAD" mit einigen Leitfäden.

    2. Wenn ein Fehler aufgetreten ist, Denken Sie daran, booleschen und zeigen Sie das Layout, das wir vorbereiten.

    3. Wenn der Benutzer auf "RELOAD" klicken, setzen Sie mbErrorOccured auf false. Und set mbReloadPressed to true.
    4. Wenn mbErrorOccured falsch ist und mbReloadPressed ist wahr, bedeutet es webview geladene Seite erfolgreich. 'Ursache, wenn ein Fehler wieder aufgetreten ist, wird mbErrorOccured auf onReceivedError (…)

    Hier ist meine volle Quelle. Überprüfen Sie dies heraus.

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

    Zusätzlich: Hier ist das Layout ….

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

    Schauen Sie sich die Diskussion bei Android WebView onReceivedError () an . Es ist ziemlich lang, aber der Konsens scheint zu sein, dass a) Sie können nicht aufhören, die "Web-Seite nicht verfügbar" Seite erscheinen, aber b) Sie konnten immer eine leere Seite laden, nachdem Sie ein onReceivedError erhalten

    Wenn Webview in eine benutzerdefinierte Ansicht eingebettet ist, so dass der Benutzer fast glaubt, dass er eine native Ansicht und nicht eine Webansicht sieht. In einem solchen Szenario zeigt die "Seite konnte nicht geladen werden" Fehler ist widersinnig, was ich normalerweise in einer solchen Situation tun, lade ich leere Seite und zeige eine Toast-Nachricht wie unten

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

    Sie können eine GET Anfrage verwenden, um den Seiteninhalt zu erhalten und diese Daten dann mit dem Webview . Auf diese Weise verwenden Sie nicht mehrere Serveranrufe. Alternativ können Sie Javascript , um das DOM Objekt auf Gültigkeit zu prüfen.

    Vielleicht verstehe ich die Frage, aber es klingt wie du sagst, du bekommst den Fehler erhalten Rückruf, und du fragst nur, was ist der beste Weg, um nicht den Fehler zu zeigen? Warum kannst du nicht einfach die Web-Ansicht aus dem Bildschirm entfernen und / oder eine andere Ansicht darüber anzeigen?

    Ich vermute, dass, wenn Sie darauf bestehen, dies zu tun, können Sie nur überprüfen, ob die Ressource dort ist, bevor Sie die loadURL-Funktion aufrufen. Einfach nur die Funktionen überschreiben und die Kontrolle vor dem Aufruf der super ()

    BEMERKUNG (vielleicht off-topic): In http gibt es eine Methode namens HEAD, die wie folgt beschrieben wird:

    Die HEAD-Methode ist identisch mit GET, außer dass der Server NICHT einen Message-Body in der Antwort zurückgeben muss

    Diese Methode könnte praktisch sein. Wie auch immer, wie Sie es implementieren … überprüfen Sie diesen Code:

     import java.util.Map; import android.content.Context; import android.webkit.WebView; public class WebViewPreLoad extends WebView{ public WebViewPreLoad(Context context) { super(context); } public void loadUrl(String str){ if(//Check if exists) super.loadUrl(str); else //handle error } public void loadUrl(String url, Map<String,String> extraHeaders){ if(//Check if exists) super.loadUrl(url, extraHeaders); else //handle error } } 

    Sie könnten diese Prüfung mit versuchen

     if(url.openConnection().getContentLength() > 0) 

    Ich würde nur die Webseite ändern, was auch immer du für Fehlerbehandlung benutzt hast:

     getWindow().requestFeature(Window.FEATURE_PROGRESS); webview.getSettings().setJavaScriptEnabled(true); final Activity activity = this; webview.setWebChromeClient(new WebChromeClient() { public void onProgressChanged(WebView view, int progress) { // Activities and WebViews measure progress with different scales. // The progress meter will automatically disappear when we reach 100% activity.setProgress(progress * 1000); } }); webview.setWebViewClient(new WebViewClient() { public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { Toast.makeText(activity, "Oh no! " + description, Toast.LENGTH_SHORT).show(); } }); webview.loadUrl("http://slashdot.org/"); 

    Das finden sie alle auf http://developer.android.com/reference/android/webkit/WebView.html

    Ich habe an diesem Problem gearbeitet, diese irritierbaren Google-Fehlerseiten zu graben. Es ist möglich mit dem Android-Beispiel Code oben gesehen und in vielen anderen Foren (fragen, wie ich weiß):

     wv.setWebViewClient(new WebViewClient() { public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { if (view.canGoBack()) { view.goBack(); } Toast.makeText(getBaseContext(), description, Toast.LENGTH_LONG).show(); } } }); 

    WENN du es in ifOverrideUrlLoading () als einen weiteren Webclient einsetzt hast. Zumindest funktioniert das für mich auf meinem 2.3.6 Gerät. Wir werden sehen, wo sonst es später funktioniert. Das würde mich jetzt nur niederdrücken, ich bin mir sicher. Das goBack-Bit gehört mir. Sie können es nicht wollen.

    Versuche dies

      @SuppressWarnings("deprecation") @Override public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { // Your handling } @Override public void onReceivedError(WebView view, WebResourceRequest req, WebResourceError rerr) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { onReceivedError(view, rerr.getErrorCode(), rerr.getDescription().toString(), req.getUrl().toString()); } } 

    Wir können die Sichtbarkeit von webView auf 0 (view.INVISIBLE) setzen und eine Nachricht anzeigen. Dieser Code funktioniert für meine App läuft auf lolipop.

     @SuppressWarnings("deprecation") @Override public void onReceivedError(WebView webView, int errorCode, String description, String failingUrl) { // hide webView content and show custom msg webView.setVisibility(View.INVISIBLE); Toast.makeText(NrumWebViewActivity.this,getString(R.string.server_not_responding), Toast.LENGTH_SHORT).show(); } @TargetApi(android.os.Build.VERSION_CODES.M) @Override public void onReceivedError(WebView view, WebResourceRequest req, WebResourceError rerr) { // Redirect to deprecated method, so you can use it in all SDK versions onReceivedError(view, rerr.getErrorCode(), rerr.getDescription().toString(), req.getUrl().toString()); } 

    Hier fand ich die einfachste Lösung. Schau dir das an..

      @Override public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { // view.loadUrl("about:blank"); mWebView.stopLoading(); if (!mUtils.isInterentConnection()) { Toast.makeText(ReportingActivity.this, "Please Check Internet Connection!", Toast.LENGTH_SHORT).show(); } super.onReceivedError(view, errorCode, description, failingUrl); } 

    Und hier ist isInterentConnection () Methode …

     public boolean isInterentConnection() { ConnectivityManager manager = (ConnectivityManager) mContext .getSystemService(Context.CONNECTIVITY_SERVICE); if (manager != null) { NetworkInfo info[] = manager.getAllNetworkInfo(); if (info != null) { for (int i = 0; i < info.length; i++) { if (info[i].getState() == NetworkInfo.State.CONNECTED) { return true; } } } } return false; } 

    Versuchen Sie dieses shouldOverrideUrlLoading , bevor Umleitung zu einem anderen URL-Check für Internet-Konnektion auf der Grundlage dieser Seite sollte geladen werden oder nicht.

    Überschreiben Sie Ihre WebViewClient-Methode

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

    view.loadUrl('about:blank') hat Nebenwirkungen, da es die ursprüngliche URL-Belastung aufhebt.

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.