Pregunta Evite que WebView muestre "página web no disponible"


Tengo una aplicación que hace un uso extensivo de una WebView. Cuando el usuario de esta aplicación no tiene conexión a Internet, aparece una página que dice "página web no disponible" y varios otros textos. ¿Hay alguna manera de no mostrar este texto genérico en mi WebView? Me gustaría proporcionar mi propio manejo de errores.

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

Lo descubrí WebView-> clearView en realidad no borra la vista.


75
2017-07-01 18:58


origen


Respuestas:


Primero crea tu propia página de error en HTML y ponla en tu carpeta de activos, llamémosla myerrorpage.html Luego con onReceivedError:

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

    }
});

88
2017-09-23 00:12



La mejor solución que he encontrado es cargar una página vacía en el evento OnReceivedError como este:

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

    view.loadUrl("about:blank");
}

23
2017-07-16 13:23



Finalmente, resolví esto. (Funciona hasta ahora ...)

Mi solución es así ...

  1. Prepare el diseño para mostrar cuándo ocurrió un error en lugar de la página web (un mensaje sucio de "página no encontrada") El diseño tiene un botón, "RECARGAR" con algunos mensajes de guía.

  2. Si ocurre un error, recuerde usar boolean y muestre el diseño que preparamos.

  3. Si el usuario hace clic en el botón "RELOAD", configure mbErrorOccured en false. Y establece mbReloadPressed en verdadero.
  4. si mbErrorOccured es falso y mbReloadPressed es verdadero, significa webview cargó la página con éxito. Porque si se produce un error de nuevo, mbErrorOccured se establecerá como verdadero en onReceivedError (...)

Aquí está mi fuente completa. Mira esto.

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

Además: aquí está el diseño ...

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


9
2018-04-08 05:39



Mira la discusión en Android WebView onReceivedError (). Es bastante largo, pero el consenso parece ser que a) no se puede detener la aparición de la página "página web no disponible", pero b) siempre se puede cargar una página vacía después de obtener un error recibido.


6
2017-07-01 19:17



Cuando la vista web está incrustada en alguna vista personalizada, el usuario casi cree que está viendo una vista nativa y no una vista web. En tal escenario que muestra el error de "la página no se pudo cargar" es absurdo, lo que suelo hacer en tal situación es cargar una página en blanco y mostrar un mensaje de brindis como se muestra a continuación

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

4
2017-11-28 07:52



Puedes usar un GET solicitar obtener el contenido de la página y luego mostrar esa información usando el Webview , de esta manera no está utilizando múltiples llamadas al servidor. Alternativa que puedes usar Javascript para verificar DOM objeto de validez


2
2017-07-11 18:49



Tal vez malinterpreto la pregunta, pero parece que estás diciendo que recibes la devolución de llamada por error, y solo preguntas cuál es la mejor manera de no mostrar el error. ¿Por qué no eliminas la vista web de la pantalla y / o muestras otra vista encima?


2
2017-07-12 11:55



Supongo que si insistes en hacer esto, simplemente puedes verificar si el recurso está allí antes de llamar a la función loadURL. Simplemente anule las funciones y realice la comprobación antes de llamar al super ()

OBSERVACIÓN (tal vez fuera del tema): en http, hay un método llamado HEAD que se describe de la siguiente manera:

El método HEAD es idéntico a GET, excepto que el servidor NO DEBE devolver un mensaje-cuerpo en la respuesta

Este método puede ser útil. De todos modos, como sea que lo implemente ... revise este código:

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

Podría intentar este control usando

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

1
2017-07-08 10:30



Aquí encontré la solución más fácil. mira esto..

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

Y aquí está el método isrentrentirection () ...

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

1
2017-07-11 07:28



Simplemente cambiaría la página web a lo que sea que esté usando para el manejo de errores:

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

esto se puede encontrar todo en http://developer.android.com/reference/android/webkit/WebView.html


0
2017-07-12 15:37