2011-07-01 15 views
11

Los enlaces internos no parecen funcionar en la versión 3 de Android en mi aplicación publicada. Mi aplicación apunta a Froyo en este punto.Los enlaces internos básicos no funcionan en la aplicación Honeycomb?

La aplicación funciona bien en toneladas de teléfonos, pero mi nuevo Galaxy Tab no puede manejar los enlaces internos. Se puede manejar dentro de una página HTML, es decir:

<a href="#faq">Go to faq</a> <!-- goes to FAQ link --> 

Va a la etiqueta más baja en la misma página:

<a name="faq" id="faq"></a> 

Sin embargo a partir de un otro archivo html, es decir, la página de índice, el enlace no se ya trabaja en Honeycomb:

<a href="mainpage.html#faq">FAQ</a> <!-- goes to error page --> 

Además, si voy a un enlace interno, y de allí a un vínculo a otra página, y luego presionar el botón de retroceso, (que se reemplaza para ir a la página anterior en vista web) se obtener el mismo error, es decir:

The webpage at file:///android_asset/folder/mainpage.html#faq might be temporarily down or it may have moved permanently to a new web address 

WTF! La vista web estaba solo en la página, pero respondiste 1 segundo después y no puede encontrarla. Tampoco puede enlazar desde otra página HTML, pero todo funciona bien en 1.x, 2.x, pero no 3.1 (no hemos probado 3.0)

NOTA: He visto esta pregunta casi idéntica: android_asset not working on Honeycomb? Pero no hay espacios en mi ruta de activos.

Lo he intentado con y sin el cliente web, y probé la configuración de DOM y caché en vano. He aquí un ejemplo de lo que actualmente disponibles alcrear:

 browser = new WebView(this); 
// browser = (WebView) findViewById(R.id.webkit); // tried with XML and without 
    browser.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY); 
    browser.getSettings().setJavaScriptEnabled(true); 
    browser.getSettings().setPluginsEnabled(true); 
// browser.getSettings().setJavaScriptCanOpenWindowsAutomatically(true); 
// browser.getSettings().setUseWideViewPort(true); 
    browser.setBackgroundColor(Color.parseColor("#333333")); 
    browser.setInitialScale(1); 
    browser.getSettings().setBuiltInZoomControls(true); 


    final Activity MyActivity = this; 
    browser.setWebChromeClient(new WebChromeClient() { 

     public void onProgressChanged(WebView view, int progress) { 
      // Make the bar disappear after URL is loaded, and changes 
      // string to Loading... 

      setProgressBarIndeterminateVisibility(true); 

      MyActivity.setTitle(" Loading . . . " + progress + "%"); 
      MyActivity.setProgress(progress * 100); // Make the bar 

      if (progress == 100) { 
       setTitle(" APP TITLE YADA YADA"); 
       setProgressBarIndeterminateVisibility(false); 
      } 
     } 
    }); 
    browser.setWebViewClient(new WebViewClient() { 
     @Override 
     public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) 
     { 
      // Handle the error 
     } 

     @Override 
     public boolean shouldOverrideUrlLoading(WebView view, String url) 
     { 
      view.loadUrl(url); // note I tried with and without overriding this 
      return true; 
     } 

    }); 
    setContentView(browser); 

    browser.loadUrl("file:///android_asset/folder/page.html"); 
+0

estoy teniendo el mismo problema, ¿alguna vez encontrar un solución? este sitio parece hablar de algo similar: http://www.droidnova.com/honeycomb-webview-changes-and-issues,876.html, pero no ofrece soluciones ... –

+0

Meses después, todavía no tengo solución para esto, aparte de detectar 3.x OS y cortar el enlace interno de la URL. La funcionalidad se ve obstaculizada, pero evita el error no encontrado. – Mischa

+0

Ahora estoy haciendo lo siguiente como una solución casi transparente. En onReceivedError, que se activa cuando la URL falla, detecto cualquier sistema operativo por encima de pan de jengibre y cortó el enlace interno para obtener la URL de la página web básica. Luego lo cargo en la vista web y hago un retraso de espera de 1/2 segundo. Luego cargué el failedURL original con el enlace interno y listo, ahora se carga. Aparentemente, el navegador está cometiendo el error clásico de intentar acceder al enlace antes de que exista. Si alguien tiene más información sobre este error, ¡soy todo oídos! – Mischa

Respuesta

3

aquí es mi código de solución por lo que el error es transparente para el usuario.
Definir el WebViewClient para el navegador, e incluyen algo así como lo siguiente para onReceivedError:

 @Override 
    public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) 
    { 
     if (failingUrl.contains("#")) { 
      Log.v("LOG", "failing url:"+ failingUrl); 
      final int sdkVersion = Integer.parseInt(Build.VERSION.SDK); 
      if (sdkVersion > Build.VERSION_CODES.GINGERBREAD) { 
       String[] temp; 
       temp = failingUrl.split("#"); 
       view.loadUrl(temp[0]); // load page without internal link 

       try { 
        Thread.sleep(400); 
       } catch (InterruptedException e) { 

        e.printStackTrace(); 
       } 
      } 

      view.loadUrl(failingUrl); // try again 
     } else { 
      view.loadUrl("file:///android_asset/tableofcontents.html"); 
     } 
    } 
    }); 

Esto engaña la vista web para cargar en primer lugar la página sin el #link, luego dormir de 0.4 de un segundo, y luego cargar la URL completa nuevamente He elegido hacer este truco solo para tablets con sdkVersion. Si hay algún otro error, cargo otra página, la tabla de contenidos.html. Esto funciona para solucionar el problema en mi Galaxy Tab.

+0

No estoy seguro de por qué se votó negativamente, pero gracias por nada, la solución funciona. También puede funcionar con otros símbolos (es decir, en oposición a #). Si va a votar, lo mínimo que puede hacer es explicarse. – Mischa

+0

Esto soluciona el problema en nuestra aplicación publicada. No debería ser necesario, pero quien lo votó realmente tiene que explicar en lugar de simplemente 'hatin' – Mischa

+0

Lo intenté pero no funcionó. Pero entonces no tenía enlaces internos para empezar. Por cierto: también hay un informe de errores: http://code.google.com/p/android/issues/detail?id=19293 – Martin

4

Aquí está la solución que uso. Funciona igual en toda la plataforma Android (probado en todos los modelos 1.6 a 4.0.1)

Cargue el archivo como lo haría normalmente, sin el punto de anclaje. Por ejemplo:

webview.loadUrl("file:///android_asset/file.html"); 

carga la URL sin el punto de anclaje (por ejemplo archivo: ///android_asset/file.html), y añade:

webview.setWebViewClient(new WebViewClient() 
{ 
    public void onPageFinished(WebView view, String url) 
    { 
     if (this.anchor != null) 
     { 
      view.loadUrl("javascript:window.location.hash='" + this.anchor + "'"); 
      this.anchor = null; 
     } 
    } 
}); 

donde ancla es el punto de anclaje que quiere saltar a.

usted tiene que asegurarse de que JavaScript está habilitado:

WebSettings webSettings = webview.getSettings(); 
webSettings.setJavaScriptEnabled(true); 

Esto es para cargar el archivo en la vista web. Ahora bien, si se desea capturar los enlaces internos que ahora están rotos, como se sugiere en la otra respuesta, reemplazar el método onReceivedError e inserte hacer algo como:

public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) 
    { 
     int found = failingUrl.indexOf('#'); 

     if (found > 0) 
     { 
      anchor = failingUrl.substring(found + 1, failingUrl.length()); 
      view.loadUrl(failingUrl.substring(0, found)); 
     } 
    } 
Cuestiones relacionadas