2011-08-10 17 views
9

Tengo una pregunta sobre la vista web Android.WebView Android - navegar hacia atrás en una dirección URL de

Asumir URL redirige a una URL B.

Mi aplicación Android cuando se trata de abrir el URL A, en vista web redirige automáticamente a la URL B.

Si una URL se redirige a otra URL, yo ver estas dos URL se almacenan en el historial webview. Ahora el historial de mi página web consiste en [,, URL A, URL B]

Al hacer clic en la tecla de retroceso desde la página web de la URL B, webview intentará cargar la URL A, que nuevamente redirige a la URL B. Tenemos que hacer doble clic en la tecla Atrás volver allá URL Un

¿Cómo puedo solucionar este problema? La lucha de las últimas 2 horas :(

+0

http://stackoverflow.com/questions/11992478/dead-loop-in-android-webview-backkey-for-redirect-href-link Esto ayudará –

Respuesta

0

Trate de sobrecargar el OnBackPressed() para overide la acción por defecto tecla Back. Allí u puede terminar la actividad actual o controlar la forma en que desea.

+0

No te entendí. ¿Cómo puedo saber si la URL es una URL redirigida o una URL normal? Además, ¿es posible eliminar una URL particular del historial de la página web? – Kumar

4
private class HelloWebViewClient extends WebViewClient { 
} 

mWebView.setWebViewClient(new HelloWebViewClient()); 

Si anulando shouldOverrideUrlLoading(), a continuación, devuelve falso. no podrían ser la forma correcta pero funciona para mí.

+2

Esta debería ser la respuesta aceptada. Volviendo cierto en shouldOverrideUrlLoading() es lo que desencadena el problema en el primer lugar, ya que la API ve que como una carga URL explícita, que se añade a la pila hacia atrás, no se trata como una redirección común (que no se añade a la pila de vuelta) – tinsukE

+0

Acepto que esta debería ser la respuesta aceptada. Devolver 'falso' produce los resultados esperados. https://developer.android.com/reference/android/webkit/WebViewClient.html –

9

tengo un mismo problema también, y descubierto la manera de resolverlo. es como el suyo. Cuando pulso en el primer enlace (www.new.a) redirige automáticamente otro enlace (mobile.n) ew.a). Por lo general, los enlaces redirigen dos o tres, y mi solución se ha trabajado en casi todos los enlaces de redirección. Espero que esta respuesta te ayude con enlaces de redireccionamiento annyoing.

finalmente me di cuenta de eso. Necesita un WebViewClient con cuatro API. There is OverrideUrlLoading(), onPageStarted(), onPageFinished() y doUpdateVisitedHistory() en el WebViewClient. Todas las API que necesitas son API 1, así que no te preocupes.

va así. Puede usar otra función en lugar de onKeyUp().

public class MyWebView extends WebView{ 
    ... 
    private int mRedirectedCount=0; 
    .... 

    @Override 
    public boolean onKeyUp(int keyCode, KeyEvent event) { 
     if ((keyCode == KeyEvent.KEYCODE_BACK) && this.canGoBack()) { 
      if(mRedirectedCount>0){ 
       while(mRedirectedCount>0){ 
        this.goBack(); 
        mRedirectedCount--; 
       } 
       mRedirectedCount=0; //clear 
      }else{ 
       this.goBack(); 
      } 
     return true; 
    } 

    private class MyWebViewClinet extends WebViewClient{ 
     boolean mIsPageFinished=true; 
     ...  

     @Override 
     public boolean shouldOverrideUrlLoading(WebView view, String url) { 
      ..... 
      if(mIsPageFinished){ 
       mRedirectedCount=0; //clear count 
      } 
      ..... 
     } 

     @Override 
     public void onPageStarted(WebView view, String url, Bitmap favicon) { 
      super.onPageStarted(view, url, favicon); 
      mIsPageFinished = false; 
     } 

     @Override 
     public void onPageFinished(WebView view, String url) { 
      super.onPageFinished(view, url); 
      mIsPageFinished = true; 
     } 

     @Override 
     public void doUpdateVisitedHistory(WebView view, String url, boolean isReload) { 
      super.doUpdateVisitedHistory(view, url, isReload); 

      if(!mIsPageFinished){ 
       mRedirectedCount++; 
      } 
     } 
+0

utilizo OnBackPressed() en lugar de onKeyUp y no funciona –

0

tengo el problema también, ahora ya se resolvió el problema.

solution

** Si se proporciona WebViewClient, return true significa que el programa de control se encarga de la dirección URL, mientras return false significa la vista web actual se ocupa de la URL. **