Android Webview Anchor Link (Jump Link) funktioniert nicht

Ich habe ein WebView in meiner Android App, die eine HTML-Zeichenfolge mit der Methode loadDataWithBaseURL () lädt. Das Problem ist, dass lokale Anker-Links ( <a href="#link"> …) nicht richtig funktionieren. Wenn der Link angeklickt wird, wird er hervorgehoben, springt aber nicht zum entsprechenden Anker.

Dies funktioniert auch nicht, wenn ich die loadUrl () – Methode des WebViews verwende, um eine Seite zu laden, die Ankerlinks enthält. Allerdings, wenn ich die gleiche URL in den Browser laden, funktionieren die Anker-Links.

Gibt es eine spezielle Handhabung, um diese für eine WebView zu arbeiten?

Ich benutze API v4 (1.6).

Es gibt nicht viel zu dem Code, hier sind die relevanten Teile von einigen Test-Code, mit dem ich gearbeitet habe:

 WebView detailBody = (WebView) findViewById(R.id.article_detail_body); String s = "<a href=\"#link\">LINK!</a><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><a name=\"link\"></a>Testing!"; detailBody.loadDataWithBaseURL(API.HomeURL(this), s, "text/html", "utf-8", ""); 

  • Warum mein Videobild nicht spielt?
  • Vergleich der Spracherkennung in Android: von Intent oder on-thread?
  • Wie installiere ich APK mit dem Android Updater Skript
  • Android: Zurück zur vorherigen Aktivität ohne Aufruf ()
  • Ist onPause garantiert, wenn eine Aktivität nicht mehr ausgeführt wird?
  • Wie bekomme ich Terminal-Befehl in Android-Anwendung?
  • 6 Solutions collect form web for “Android Webview Anchor Link (Jump Link) funktioniert nicht”

    Es sieht so aus wie das Problem ist, dass ich ein WebView in einem ScrollView hatte. Die WebView ist nicht in der Lage, zu einem Anker-Link zu blättern, wenn so konfiguriert. Nach dem Refactoring meines Layouts, um die ScrollView zu beseitigen, funktionieren die Anker-Links korrekt.

    Android Webview Anchor Link (Jump Link) funktioniert nicht

    True, WebView Anchor Links oder Sprung Links durch die #LINK Erweiterung auf die URL initiiert wird nicht funktionieren, wenn die WebView innerhalb eines ScrollView (*) ist.

    Dennoch ist das Problem für mich und anscheinend andere, dass das #LINK funktioniert, wenn es von einer Berührung in einem href gestartet wird, aber wird ignoriert, wenn über die URL gestartet wird. Andere Symptome beinhalten das Navigieren zum Link nur zum ersten Mal in einer Sitzung oder navigieren zum Ende der HTML-Datei.

    Die Lösung ist, die URL nach einer kurzen Verzögerung zu laden.

    Hier ist ein Beispiel:

    Mein html wird in den verwaltungen gespeichert: res / assets / help.html

    Mit Anker wie folgt:

     <a name="helplinkcontacts"/> 

    Und so geladen:

     final String baseUrl = "file:///android_asset/help.html#helplinkcontacts"; final WebView helpTextView = (WebView)findViewById(R.id.help_dialog_text); helpTextView.loadUrl(baseUrl); // Ignores Anchor!! 

    Ich habe den Timer so hinzugefügt:

     final String baseUrl = "file:///android_asset/help.html#helplinkcontacts"; final WebView helpTextView = (WebView)findViewById(R.id.help_dialog_text); Timer timer = new Timer(); timer.schedule(new TimerTask() { @Override public void run() { helpTextView.loadUrl(baseUrl); } }, 400); 

    Hinweis: Kürzere Verzögerungen, wie z. B. 100ms, konnten nicht zum Link navigieren.

    (*) Es stellt sich heraus, dass so viele von uns unsere WebViews innerhalb von ScrollViews haben, weil wir mit einem TextView Rendering Spannbare Text begonnen haben, der beide HTML unterstützt und ein ScrollView benötigt. Wie auch immer, entfernen Sie die ScrollView, sobald Sie Ihre TextView in eine WebView konvertieren.

    Meine Lösung ist, überprüfen Sie diese Antwort

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

    Ich hatte ein ähnliches Problem. Nichts würde auf Anker-Tags in der HTML-Zeichen zu springen. Ich habe nicht meine WebView in einem ScrollView. Stattdessen war das Problem die Basis-URL, die ich in loadDataWithBaseURL gegangen war, hatte keinen Doppelpunkt (':'). Ich glaube, die Basis muss einen Text haben, dann einen Doppelpunkt, dann noch mehr Text, zB "app: htmlPage24".

    Also hier ist der erste Aufruf zu meinem WebView, nur um die Daten in der Zeichenfolge HTML_24 zu laden:

     wv.loadDataWithBaseURL("app:htmlPage24", HTML_24, "text/html", "utf-8", null); 

    Dann habe ich eine Liste, die auf Abschnitte auf dem Bildschirm springt, abhängig von der Liste, die Sie tippen:

     sectionsLV.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { wv.loadUrl("app:htmlPage24#section" + arg2); } }); 

    HTML_24 ist so etwas wie:

     <html> ... <a name="section1"/> ... <a name="section2"/> ... <a name="section3"/> ... </html> 

    WebView in Android 4.0 kann keine URLs mit Links in ihnen öffnen. ZB "file: ///android_asset/help.html#helplinkcontacts"

    Hier ist, wie ich mich umstellt habe

     WebView wv = (WebView) nagDialog.findViewById(R.id.wv); wv.getSettings().setJavaScriptEnabled(true); wv.setWebViewClient(new MyWebViewClient(link)); wv.loadUrl("file:///android_asset/help.html"); 

    Und definiere die benutzerdefinierte WebViewClient-Klasse

     class MyWebViewClient extends WebViewClient { private String link; public MyWebViewClient(String link) { this.link = link; } @Override public void onPageFinished(WebView view, String url) { if (!"".equals(link) && link != null) view.loadUrl("javascript:location.hash = '#" + link + "';"); } } 
     try this String myTemplate = "<a href=\"#link\">LINK!</a><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><a name=\"link\"></a>Testing!"; myWebView.loadDataWithBaseURL(null, myTemplate, "text/html", "utf-8", null); 

    Das Wort "Testing!" Muss außerhalb des Bildschirms sein, um zu sehen, dass es funktioniert.

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.