2012-06-25 21 views
8

Mam do czynienia z dziwnym problemem w webview w czasie ładowania treści html z linkiem do kotwicy.
Poniższy kod działa idealnie do tagu kotwicy, ale tylko raz.
Po drugie naciśnięcie znacznika zakotwiczenia powoduje, że nie działa .Android: Html Anchor Link działa tylko raz w 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); 

    } 

Próbowałem this linku ale nie pracował dla mnie.

UPDATE:

Testowanie wynikiem mojego kodu w różne urządzenia.

Praca
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

nie działa
1. LG Optimus -> 2,2
2. DELL XCD35 (ZTE Blade) -> 2,2
3. HTC WildFire -> 2.2.1

Czy ten problem z systemem operacyjnym czy coś innego? Jakiekolwiek rozwiązanie tego?


+0

Wszystkie @DownVoters można wyjaśnić powód głosowania w dół? – Mihir

Odpowiedz

13

Problem polegał na ponownym załadowaniu strony po kliknięciu odnośnika zakotwiczenia.

Użyłem poniższy kod,

chapters.xml w folderze 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> 

kod JAVA: Pierwszy sposób

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 JAVA KOD: Drugi sposób - Wypróbowałem to, co napisałem: onTouchListener i to działa dobrze dla mnie.

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

     }); 
    } 
} 

Aby Otworzyć Anchor Tag innego pliku w formacie HTML z jednego pliku

 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. Dobra odpowiedź –

+0

Jego działanie jest idealne. Dzięki człowieku ... – Mihir

+3

Nie wydaje się być wykonalnym rozwiązaniem. Ponieważ użytkownik może musieć dotknąć dowolnego miejsca w przeglądarce internetowej, aby za każdym razem ponownie załadować przeglądarkę. –

2

Proszę spróbować z tym kodem. To działa dobrze .

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 za bardzo dobrą Próba, ale za pomocą kodu, testowanie w emulatorze czasami działa i ponownie zatrzymuje się po 2-3 kliknięcia ponownie działa, aw urządzeniu HTC w ogóle nie działa, Powiedz mi, czy moje testy są złe. – MKJParekh

+0

@Chirag Raval to działa. Dzięki ... ale czasami trzeba kliknąć link dwa razy lub więcej. – Mihir

0

Ten problem występuje na Androidzie 4.0.3 i 4.0.4 urządzeniami: Jeśli masz stronę internetową mobilnego (zarówno w zasoby lub załadowane z Internetu), których zawartość wypełnia się na całej szerokości ekranu, a następnie kilka linków takich jak:

<a href=... HTML links 

...nie będzie działać! Po prostu nie załadują następnej strony! To trochę dziwne.

Błąd jest udokumentowane tutaj: http://code.google.com/p/android/issues/detail?id=929

Mimo że był zalogowany w 2009 roku, to jednak wciąż stało na Androidzie 4.0.3/4.0.4 urządzeń.

Rozwiązaniem jest nie używać:

android:layout_height="wrap_content na WebView.

Wymień go:

android:layout_height="match_parent 
0

Wypróbuj ten prosty 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>