Android – cómo evitar que webview cargue cuando no hay conexión a internet

Tengo una aplicación para Android que tiene una vista web. Cuando no hay conexión a Internet, la vista web mostrará la página no disponible. Quiero hacer que esto se vea como una aplicación tanto como sea posible, así que no quiero mostrar esta página. Encontré información útil en línea enseñándole cómo esconder o cargar algo más para cubrirlo, pero lo que realmente quiero es quedarse en la página actual y un pequeño diálogo emergente dice que no hay conexión. Básicamente, cuando el usuario hace clic en cualquier elemento dentro de la vista web, compruebe primero la conexión. Si no hay conexión, permanezca en donde estaba y haga estallar hacia fuera un cuadro de diálogo.

¡¡Gracias por la ayuda!!

Editado:

Como he dicho, ya sé cómo comprobar la conexión a Internet de las muestras en línea. Mi problema es que no sé cómo detener la carga de la siguiente página. Para ser claro, cuando los usuarios intentan ir a la página siguiente, compruebe para la conexión del Internet. Si no hay conexión, la página se quedará donde estaba y no iría a la página siguiente. Quiero que los usuarios puedan ver su última página cargada y informarse mientras el contenido de la página web continúa allí. ¡Gracias!

He utilizado lo siguiente en mis proyectos:

DetectConnection.Java

import android.content.Context; import android.net.ConnectivityManager; public class DetectConnection { public static boolean checkInternetConnection(Context context) { ConnectivityManager con_manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); if (con_manager.getActiveNetworkInfo() != null && con_manager.getActiveNetworkInfo().isAvailable() && con_manager.getActiveNetworkInfo().isConnected()) { return true; } else { return false; } } } 

Código principal:

 if (!DetectConnection.checkInternetConnection(this)) { Toast.makeText(getApplicationContext(), "No Internet!", Toast.LENGTH_SHORT).show(); } else { wv = (WebView) findViewById(R.id.donate_webView1); c = new CustomWebViewClient(); wv.setWebViewClient(c); wv.clearCache(true); wv.clearHistory(); wv.getSettings().setJavaScriptEnabled(true); wv.getSettings().setJavaScriptCanOpenWindowsAutomatically(true); wv.getSettings().setBuiltInZoomControls(true); wv.loadUrl("http://www.google.com"); } // Function to load all URLs in same webview private class CustomWebViewClient extends WebViewClient { public boolean shouldOverrideUrlLoading(WebView view, String url) { if (!DetectConnection.checkInternetConnection(this)) { Toast.makeText(getApplicationContext(), "No Internet!", Toast.LENGTH_SHORT).show(); } else { view.loadUrl(url); } return true; } } 

Usted puede utilizar mi CustomWebViewClient él –

  • Muestra el diálogo de carga mientras carga la página web
  • Mostrar mensajes de error en caso de que falla la carga de la página
  • En el caso de No Internet, ofrece al usuario una opción para ir a la configuración y habilitar datos móviles.
  • En el caso de otro tipo de errores, permite al usuario volver a cargar la página web.

Todo lo que necesitas hacer es adjuntarlo a tu webView

WebView.setWebViewClient (nuevo CustomWebViewClient ());

Clase CustomWebViewClient

  /** * WebViewClient subclass loads all hyperlinks in the existing WebView */ public class CustomWebViewClient extends WebViewClient { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { // When user clicks a hyperlink, load in the existing WebView view.loadUrl(url); return true; } Dialog loadingDialog = new Dialog(WebViewActivity.this); @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { super.onPageStarted(view, url, favicon); webViewPreviousState = PAGE_STARTED; if (loadingDialog == null || !loadingDialog.isShowing()) loadingDialog = ProgressDialog.show(WebViewActivity.this, "", "Loading Please Wait", true, true, new DialogInterface.OnCancelListener() { @Override public void onCancel(DialogInterface dialog) { // do something } }); loadingDialog.setCancelable(false); } @RequiresApi(api = Build.VERSION_CODES.M) @Override public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) { if (isConnected()) { final Snackbar snackBar = Snackbar.make(rootView, "onReceivedError : " + error.getDescription(), Snackbar.LENGTH_INDEFINITE); snackBar.setAction("Reload", new View.OnClickListener() { @Override public void onClick(View view) { webView.loadUrl("javascript:window.location.reload( true )"); } }); snackBar.show(); } else { final Snackbar snackBar = Snackbar.make(rootView, "No Internet Connection ", Snackbar.LENGTH_INDEFINITE); snackBar.setAction("Enable Data", new View.OnClickListener() { @Override public void onClick(View view) { startActivityForResult(new Intent(Settings.ACTION_WIRELESS_SETTINGS), 0); webView.loadUrl("javascript:window.location.reload( true )"); snackBar.dismiss(); } }); snackBar.show(); } super.onReceivedError(view, request, error); } @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) @Override public void onReceivedHttpError(WebView view, WebResourceRequest request, WebResourceResponse errorResponse) { if (isConnected()) { final Snackbar snackBar = Snackbar.make(rootView, "HttpError : " + errorResponse.getReasonPhrase(), Snackbar.LENGTH_INDEFINITE); snackBar.setAction("Reload", new View.OnClickListener() { @Override public void onClick(View view) { webView.loadUrl("javascript:window.location.reload( true )"); } }); snackBar.show(); } else { final Snackbar snackBar = Snackbar.make(rootView, "No Internet Connection ", Snackbar.LENGTH_INDEFINITE); snackBar.setAction("Enable Data", new View.OnClickListener() { @Override public void onClick(View view) { startActivityForResult(new Intent(Settings.ACTION_WIRELESS_SETTINGS), 0); webView.loadUrl("javascript:window.location.reload( true )"); snackBar.dismiss(); } }); snackBar.show(); } super.onReceivedHttpError(view, request, errorResponse); } @Override public void onPageFinished(WebView view, String url) { if (webViewPreviousState == PAGE_STARTED) { if (null != loadingDialog) { loadingDialog.dismiss(); loadingDialog = null; } } } } 

Compruebe el método de conectividad

  /** * Check if there is any connectivity * * @return is Device Connected */ public boolean isConnected() { ConnectivityManager cm = (ConnectivityManager) this.getSystemService(Context.CONNECTIVITY_SERVICE); if (null != cm) { NetworkInfo info = cm.getActiveNetworkInfo(); return (info != null && info.isConnected()); } return false; } 

Deberá sobrescribir el método shouldOverrideUrlLoading de un WebViewClient para capturar clics de URL.

Para comprobar el estado Wifi, desee utilizar el ConnectivityManager

Prueba esto:

 WebView mWebView; NetworkInfo networkInfoWifi = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE).getNetworkInfo(ConnectivityManager.TYPE_WIFI); mWebView.setWebViewClient(mWebClient); WebViewClient mWebClient = new WebViewClient(){ @Override public boolean shouldOverrideUrlLoading(WebView view, String url){ return true; } @Override public void onLoadResource(WebView view, String url){ if (networkInfoWifi.isConnected()) { //Take action } } } 

Recomendaría romper su problema en dos pasos más pequeños: haga clic en Interceptación y Comprobación del estado de la conexión y busque en ellos. Esto produce un montón de resultados, y pude utilizar estas dos respuestas existentes para armar el código:

Clic de Webview de Interceptación

Compruebe la conexión Wifi

  webView.setWebViewClient(new WebViewClient() { int errorCode = 0; @SuppressWarnings("deprecation") @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { return handleUri(view, url); } @TargetApi(Build.VERSION_CODES.N) @Override public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { return handleUri(view, request.getUrl().toString()); } private boolean handleUri(WebView view, final String url) { view.loadUrl(url); return true; } @Override public void onPageFinished(WebView view, String url) { if(errorCode == 0) { //CHECK IS PAGE I NEED AND DO STUFF } else { errorCode = 0; //delay and try again } } @SuppressWarnings("deprecation") @Override public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { handleError(errorCode); } @TargetApi(Build.VERSION_CODES.N) @Override public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) { handleError(error.getErrorCode()); } private void handleError(int errorCode) { this.errorCode = errorCode; } }); 
  • ¿Hay un oyente para cuando el WebView muestra su contenido?
  • cargar pdf desde url en android
  • Presentar contenido html como "páginas dinámicas"
  • ¿Hay una manera de ocultar y mostrar los controles de zoom en un WebView?
  • Deshabilitar el control de zoom en WebView mediante API 7 Android
  • Android: Limitar la reducción de zoom en la vista web
  • WebView no está llenando toda la pantalla del dispositivo o el emulador
  • Google Analytics: vista web y vista de aplicaciones
  • Vista de Android WebView
  • ¿Puedo obtener contenido de WebView con funciones de accesibilidad de android?
  • Cómo activar y desactivar con seguridad el zoom de WebView según sea necesario
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.