2012-06-25 26 views
8

Sto affrontando qualche strano problema in webview al momento del caricamento del contenuto html con link di ancoraggio.
Il seguente codice funziona perfettamente per il tag di ancoraggio ma solo una volta.
La seconda volta che preme il tag di ancoraggio è non funzionante.Android: Html Anchor Link funziona solo una volta nella 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); 

    } 

Ho provato this link, ma non ha funzionato per me.

UPDATE:

risultato della prova del mio codice in vari dispositivi.

Lavorare
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

non funziona
1. LG Optimus -> 2.2
2. DELL XCD35 (ZTE blade) -> 2.2
3. HTC WildFire -> 2.2.1

Si tratta di questo problema del sistema operativo o di qualcos'altro? Qualche soluzione per questo?


+0

Tutti @DownVoters possono spiegare la ragione per il voto verso il basso? – Mihir

risposta

13

Il problema era Ricaricare nuovamente la pagina dopo il collegamento di ancoraggio Fare clic.

Ho usato il seguente codice,

chapters.xml nella cartella Assets

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

codice Java: primo modo

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

     } 
    } 
} 

EDIT codice Java: Seconda Way - Ho provato questa cosa a onTouchListener e funziona bene per me.

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

     }); 
    } 
} 

di aprire un altro di file HTML tag di ancoraggio da un file

 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. Bella risposta –

+0

Its Working perfect. Grazie amico ... – Mihir

+3

Non sembra essere una soluzione fattibile. Perché l'utente potrebbe dover toccare ovunque nella webview in modo che ricarichi ogni volta webview. –

2

Si prega di provare con questo codice. Funziona bene.

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 per l'ottimo tentativo ma utilizzando il codice, il test in emulatore a volte funziona e si interrompe nuovamente dopo 2-3 scatti di nuovo inizia a funzionare e nel dispositivo HTC non funziona affatto, dimmi se il mio test è sbagliato. – MKJParekh

+0

@Chirag Raval funziona. Grazie .. ma a volte è necessario fare clic sul collegamento due volte o più. – Mihir

0

Questo problema si verifica su Android 4.0.3 e 4.0.4 dispositivi: se si dispone di una pagina web per cellulari (sia in beni o caricati dal web) i cui contenuti si riempiono su tutta la larghezza dello schermo, quindi alcuni collegamenti come questo:

<a href=... HTML links 

...non funzionerà! Non riusciranno a caricare la pagina successiva! È un po 'strano

Il bug è documentato qui: http://code.google.com/p/android/issues/detail?id=929

Anche se è stato registrato nel 2009, lo fa ancora accadere su Android 4.0.3/4.0.4 dispositivi.

La soluzione è non utilizzare:

android:layout_height="wrap_content sul WebView.

Sostituirla con:

android:layout_height="match_parent 
0

Provate questo semplice 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> 
Problemi correlati