2012-06-25 28 views
8

Tengo un problema extraño en la vista web en el momento de cargar el contenido html con el enlace de anclaje.
El siguiente código funciona perfecto para la etiqueta de anclaje pero solo una vez.
La segunda vez que presiono la etiqueta de anclaje es que no funciona.Android: Html Anchor Link funciona solo una vez en webview

protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.mywebview); 

     String html = "<html><body><p><a href='#C4'>See also Chapter 4</a></p><p><h2>Chapter 1</h2><p>This chapter explains ba bla bla</p><h2>Chapter 2</h2><p>This chapter explains ba bla bla</p><h2>Chapter 3</h2><p>This chapter explains ba bla bla</p><h2><a name='C4'>Chapter 4</a></h2><p>This chapter explains ba bla bla</p><h2>Chapter 5</h2><p>This chapter explains ba bla bla</p><h2>Chapter 6</h2><p>This chapter explains ba bla bla</p><h2>Chapter 7</h2><p>This chapter explains ba bla bla</p><h2>Chapter 8</h2><p>This chapter explains ba bla bla</p><h2>Chapter 9</h2><p>This chapter explains ba bla bla</p></body></html>"; 
     String mime = "text/html"; 
     String encoding = "utf-8"; 

     WebView myWebView = (WebView)this.findViewById(R.id.webView1); 
     myWebView.loadDataWithBaseURL(null, html, mime, encoding, null); 

    } 

he tratado this enlace, pero no funcionó para mí.

ACTUALIZACIÓN:

resultado de la prueba de mi código en varios dispositivos.

Trabajando
1. Samsung S Plus -> 2.3.4
2. Samsung Galaxy Y -> 2.3.6
3. Samsung Galaxy Tab -> 2.3.3
4 . Motorola Xoom -> 3,2

no funciona
1. LG Optimus -> 2,2
2. DELL XCD35 (ZTE Blade) -> 2.2
3. HTC Wildfire -> 2.2.1

¿Se trata de un problema de sistema operativo u otra cosa? ¿Alguna solución para esto?


+0

Todos @DownVoters pueden explicar la razón para la votación abajo? – Mihir

Respuesta

13

El problema fue volver a cargar la página después del enlace Anclar Haga clic en.

He utilizado el siguiente código,

chapters.xml en la carpeta Activos

<html> 
<body> 
<p><a href="#C4">See also Chapter 4</a></p> 
<p><h2><a name='C1'>Chapter 1<a></h2><p>This chapter explains ba bla bla</p> 
<h2>Chapter 2</h2><p>This chapter explains ba bla bla</p> 
<h2>Chapter 3</h2><p>This chapter explains ba bla bla</p> 
<h2><a name='C4'>Chapter 4</a></h2><p>This chapter explains ba bla bla</p> 
<h2>Chapter 5</h2><p>This chapter explains ba bla bla</p> 
<h2>Chapter 6</h2><p>This chapter explains ba bla bla</p> 
<h2>Chapter 7</h2><p>This chapter explains ba bla bla</p> 
<a href="#C1">See also Chapter 1</a> 
</body> 
</html> 

código Java: Primera forma

public class MainActivity extends Activity { 
    WebView myWebView; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     myWebView = new WebView(this); 
     myWebView.getSettings().setJavaScriptEnabled(true); 
     myWebView.loadUrl("file:///android_asset/chapters.html"); 

     setContentView(myWebView); 

     final GestureDetector gestureDetector = new GestureDetector(
       new MyGestureDetector()); 
     View.OnTouchListener gestureListener = new View.OnTouchListener() { 
      public boolean onTouch(View v, MotionEvent event) { 
       return gestureDetector.onTouchEvent(event); 
      } 
     }; 
     myWebView.setOnTouchListener(gestureListener); 
    } 

    class MyGestureDetector extends SimpleOnGestureListener { 
     @Override 
     public boolean onSingleTapConfirmed(MotionEvent e) { 
      myWebView.reload(); 
      Log.i("", "Reload"); 
      return super.onSingleTapConfirmed(e); 

     } 
    } 
} 

EDITAR JAVA CÓDIGO: segunda forma - He intentado esto inss onTouchListener y que funciona bien para mí.

public class MainActivity extends Activity { 
    WebView myWebView; 
    public static boolean flag = false; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     myWebView = new WebView(this); 
     myWebView.getSettings().setJavaScriptEnabled(true); 
     myWebView.loadUrl("file:///android_asset/chapters.html"); 
     setContentView(myWebView); 
     myWebView.setWebViewClient(new WebViewClient() { 
      public void onPageFinished(WebView view, String url) { 
       if (url.contains("#") && flag == false) { 
        myWebView.loadUrl(url); 
        flag = true; 
       } else { 
        flag = false; 
       } 
      } 

     }); 
    } 
} 

para abrir el ancla etiqueta de otro archivo HTML de un archivo

 myWebView = new WebView(this); 
     myWebView.getSettings().setJavaScriptEnabled(true); 
     myWebView.loadUrl("file:///android_asset/1.htm"); 
     myWebView.setWebViewClient(new WebViewClient() { 
      @Override 
      public boolean shouldOverrideUrlLoading(WebView view, String url) { 
       try{ 
       chapter = url.substring(url.indexOf("#"),url.length()); 
       url = url.substring(0,url.indexOf("#")); 
       }catch (Exception e) { 
        chapter = ""; 
       } 
       myWebView.loadUrl(url); 
       return true; 
      } 
      public void onPageFinished(WebView view, String url) { 
       if (!chapter.equalsIgnoreCase("") && flag == false) { 
        myWebView.loadUrl(url+chapter); 
        flag = true; 
       } else { 
        flag = false; 
       } 
      } 
     }); 
     setContentView(myWebView); 
+4

+ 1. Buena respuesta –

+0

Its Working perfect. Gracias, hombre ... – Mihir

+3

No parece ser una solución factible. Debido a que el usuario puede tener que tocar en cualquier parte de la vista web, volverá a cargar la vista web cada vez. –

2

Por favor, intente con este código. Funciona bien .

String html = "<html><body><p><a href='#C4'>See also Chapter 4</a></p><p><h2>Chapter 1</h2><p>This chapter explains ba bla bla</p><h2>Chapter 2</h2><p>This chapter explains ba bla bla</p><h2>Chapter 3</h2><p>This chapter explains ba bla bla</p><h2><a name='C4'>Chapter 4</a></h2><p>This chapter explains ba bla bla</p><h2>Chapter 5</h2><p>This chapter explains ba bla bla</p><h2>Chapter 6</h2><p>This chapter explains ba bla bla</p><h2>Chapter 7</h2><p>This chapter explains ba bla bla</p><h2>Chapter 8</h2><p>This chapter explains ba bla bla</p><h2>Chapter 9</h2><p>This chapter explains ba bla bla</p></body></html>"; 
    String mime = "text/html"; 
    String encoding = "utf-8"; 

    final WebView myWebView = (WebView)this.findViewById(R.id.webView); 
    myWebView.getSettings().setJavaScriptEnabled(true); 
    myWebView.loadDataWithBaseURL("app:html", html, mime, encoding, null); 

    myWebView.setWebViewClient(new WebViewClient() 
    { 
     @Override 
     public void onPageFinished(WebView view, String url) 
     { 
      super.onPageFinished(view, "app:html"); 
      view.loadDataWithBaseURL("app:html", html, mime, encoding, null); 
     } 
    }); 
+0

+1 para muy buenos Intento pero usando su código, las pruebas en el emulador a veces funcionan y nuevamente se detienen después de que 2-3 clics comienzan a funcionar nuevamente y en el dispositivo HTC no funciona en absoluto, dígame si mi prueba es incorrecta. – MKJParekh

+0

@Chirag Raval funciona. Gracias ... pero a veces tiene que hacer clic en el enlace dos veces o más. – Mihir

0

Este problema ocurre en Android 4.0.3 y 4.0.4 dispositivos: Si usted tiene una página web móvil (ya sea en activos o cargados desde la web) cuyos contenidos ocupan todo el ancho de la pantalla, luego algunos enlaces como este:

<a href=... HTML links 

...¡no trabajará! ¡Simplemente no podrán cargar la página siguiente! Es un poco extraño

El fallo está documentado aquí: http://code.google.com/p/android/issues/detail?id=929

A pesar de que se registró en 2009, inmóvil sucede en Android 4.0.3/4.0.4 dispositivos.

La solución es no utilizar:

android:layout_height="wrap_content en la vista Web.

Reemplazar con:

android:layout_height="match_parent 
0

Prueba esta sencilla 2-liner Javascript

<html> 
<body> 
<head> 
<script language="javascript"> 
     function jump_top() { 
      location.href = "#top"; 
      location.hash = ""; 
     } 
</script> 
</head> 

<body> 
<a name="top"></a> 
<br /><br /><br /><br /> 
... 
<br />Now you are at the bottom of the page 
<br /> 
<a onclick="jump_top()">To Top</a> 
</body> 
</html> 
Cuestiones relacionadas