2017-12-18 1 views
0

Ich bin Neuling in Android-Programmierung, erstellte ich Webview App für meine Website, so weit kein Problem, bis Internet-Verbindung verloren ist, kann ich verhindern, URL-Seite zu öffnen Ich klicke auf einen Link von Webview ohne Show "Webseite nicht verfügbar"?Verhindern das Öffnen einer URL in einer Webansicht, wenn die Internetverbindung verloren ist

Mein Erwartetes Ergebnis ist:

anzeigen Toast "Keine Internetverbindung" und Noch im gleichen Seite wenn ich Link klicken in Webview

ich versuche, in onReceivedError zu verwenden:

if (wv.canGoBack()) {wv.goBack();} 

aber immer noch, zeige "Webseite nicht verfügbar" und zurück zur vorherigen Seite

PS:Dieser Code anzeigen Toast "Keine Internetverbindung", zeigen aber immer noch "die Seite nicht verfügbar"

MyCode

MainActivity.java

import android.content.Context; 
import android.content.DialogInterface; 
import android.net.ConnectivityManager; 
import android.net.NetworkInfo; 
import android.support.v7.app.AlertDialog; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.View; 
import android.view.Window; 
import android.view.WindowManager; 
import android.webkit.WebView; 
import android.webkit.WebViewClient; 
import android.widget.Toast; 

public class MainActivity extends AppCompatActivity { 
    WebView wv; 
    String URL; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     if(!isNetworkAvailable()){ 
      Toast.makeText(getApplicationContext(),"No Internet Connection",Toast.LENGTH_SHORT).show(); 
     }else{ 
      URL = "Https://resiongkir.dzakiyyah.com"; 
      wv = (WebView)findViewById(R.id.web); 
      wv.setWebViewClient(new WebViewClient(){ 
       @Override 
       public void onPageFinished(WebView view, String url){ 
        findViewById(R.id.imageView1).setVisibility(View.GONE); 
        findViewById(R.id.web).setVisibility(View.VISIBLE); 
       } 

       @Override 
       public void onReceivedError(WebView view, int errorCode,String description, final String failingUrl) { 
        Toast.makeText(getApplicationContext(), "No Internet Connection Or " + description , Toast.LENGTH_LONG).show(); 
        super.onReceivedError(view, errorCode, description, failingUrl); 
       } 
      }); 
      wv.getSettings().setJavaScriptEnabled(true); 
      wv.getSettings().setJavaScriptCanOpenWindowsAutomatically(true); 
      wv.getSettings().setBuiltInZoomControls(true); 
      wv.loadUrl(URL); 
     } 
    } 

    private boolean isNetworkAvailable(){ 
     ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
     NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo(); 
     return activeNetworkInfo != null && activeNetworkInfo.isConnectedOrConnecting(); 
    } 

    @Override 
    public void onBackPressed(){ 
     if(wv.canGoBack()){ 
      wv.goBack(); 
     }else{ 
      AlertDialog.Builder builder = new AlertDialog.Builder(this); 
      builder.setMessage("Anda yakin akan menutup ResiOngkir?") 
        .setCancelable(false) 
        .setPositiveButton("Ya", new DialogInterface.OnClickListener() { 
         public void onClick(DialogInterface dialog, int id) { 
          MainActivity.this.finish(); 
         } 
        }) 
        .setNegativeButton("Tidak", new DialogInterface.OnClickListener() { 
         public void onClick(DialogInterface dialog, int id) { 
          dialog.cancel(); 
         } 
        }); 
      AlertDialog alert = builder.create(); 
      alert.show(); 
     } 
    } 
} 

activity_main.xml

<?xml version="1.0" encoding="utf-8"?> 
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context="com.dzakiyyah.abu.resiongkir.MainActivity"> 

    <ImageView 
     android:id="@+id/imageView1" 
     android:layout_width="228dp" 
     android:layout_height="216dp" 
     android:layout_marginBottom="8dp" 
     android:layout_marginEnd="8dp" 
     android:layout_marginStart="8dp" 
     android:layout_marginTop="8dp" 
     android:contentDescription="@string/app_logo" 
     android:visibility="visible" 
     app:layout_constraintBottom_toTopOf="@+id/textView" 
     app:layout_constraintEnd_toEndOf="parent" 
     app:layout_constraintStart_toStartOf="parent" 
     app:layout_constraintTop_toTopOf="parent" 
     app:layout_constraintVertical_bias="0.975" 
     app:srcCompat="@drawable/muava" /> 


    <WebView 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:id="@+id/web" 
     android:visibility="gone"/> 

</android.support.constraint.ConstraintLayout> 
+0

Was wollen Sie stattdessen zeigen? Weil der Toast verschwindet, aber etwas muss gezeigt werden? – Xenolion

+0

Wenn ich auf Link klicke, zeige nur Toast, ohne dass die Webseite nicht verfügbar ist –

+1

Diese API definiert nur eine Möglichkeit, das Laden von Seiten abzufangen - indem man webClient die Substate-Antwort mit seiner eigenen in 'shouldInterceptRequest' lässt. Ich bezweifle, dass das für dich wirklich funktionieren wird. –

Antwort

3

Sie sollten dann einen alternativen HTML-Code zum Laden bereitstellen. Wenn es einfach ist, ist nur ein String erforderlich! Wie folgt aus:

@Override 
public void onReceivedError(WebView view, int errorCode,String description, final String failingUrl) { 
     Toast.makeText(getApplicationContext(), "No Internet Connection Or " + description , Toast.LENGTH_LONG).show(); 

     String error_summary = "<html><body> Dear User, An error happened <b>No internet</b> connection!.</body></html>"; 
     view.loadData(error_summary, "text/html", null); 
     super.onReceivedError(view, errorCode, description, failingUrl); 
} 

Aber wenn Sie die Webseite wollen die gleiche URL haben (nicht geladen alles neu), Das Beste ist, um es INVISIBLE dies ist, was Sie wollen nach Ihren Kommentaren Statt Laden etwas einfach machen eine unsichtbare Webansicht, die zu einer leeren Seite führt!

Statt Laden etwas in onReceivedError dies tun:

view.setVisibility(View.INVISIBLE); 

Wenn das Internet Connection es VISIBLE wieder zu machen erinnern:

wv.setVisibility(View.VISIBLE); 
Verwandte Themen