WebView salta all'ancora usando loadDataWithBaseUrl

La mia applicazione Android utilizza un WebView per visualizzare un gruppo di codice HTML che genero 'in volo'. Il codice HTML viene caricato utilizzando il seguente codice:

StringBuilder builder = new StringBuilder(); // HTML builder.append("<html><head><link rel=\"stylesheet\" href=\"file:///android_asset/style.css\" type=\"text/css\">"); builder.append("</link></head><body>"); builder.append(getThreadBody()); builder.append("</body></html>"); webview.loadDataWithBaseURL("file:///android_asset/", builder.toString(), "text/html", "utf-8", null); 

Tutto questo funziona veramente bello. Notare che non sto caricando un file HTML effettivo, sto solo creando una string che rappresenta un HTML (speriamo valido) e caricarla nel WebView.

  • Problema di Android con implementazione di fluttuazioni in NestedScrollView
  • Aggiunta di impostazioni a Impostazioni
  • Dimensioni multiple dello schermo Android con la stessa densità
  • Android okHttp addFormDataPart in modo dinamico per l'image multipla
  • Come rilevare il numero di versione di Android in Firefox per Android?
  • Scorciatoia di formattazione di codice nello studio Android
  • Comunque, l'HTML che genero (la parte del metodo "getThreadBody") contiene anchors denominati, ad esempio come questo;

     <div> <a name="949823">Anchor 1</a> <div>All kinds of stuff</div> <a name="895984">Anchor 2</a> <div>...</div> </div> 

    Adesso in alcuni casi voglio che il WebView passi a uno di questi ancoraggi non appena caricherò l'HTML. Per quanto mi riguarda, il WebView support la navigazione (scorrimento in questo caso) per gli ancoraggi denominati, ma la cattura è che nessuno fa clic su un collegamento ipertestuale a tali ancoraggi, voglio che il WebView scorri quando viene caricato (non è un problema se ci sono è un breve ritardo tra il caricamento HTML e lo scorrimento, il mio punto è che non dovrebbe richiedere l'interazione con l'utente).

    Credo che il comportmento possa essere ottenuto utilizzando il metodo loadUrl di WebView e fornendo un URL con l'ancoraggio in atto, ad esempio

     webview.loadUrl("file:///android_asset/page.html#895984", ...) 

    Tuttavia, poiché non salvo l'HTML in qualsiasi file che non posso utilizzare questo metodo … Naturalmente salvare l'HTML in un file temporaneo può essere una soluzione, ma vorrei mantenerlo come ultima risorsa, ci deve essere un modo più semplice?

    Come posso raggiungere questo objective? Grazie!


    Risolto Ecco il codice che funziona. Ho trovato un breve ritardo è stato richiesto per lasciare il carico della pagina prima di eseguire il javascript altrimenti era tipo di 50/50 se funzionava o no …

      StringBuilder builder = new StringBuilder(); // HTML builder.append("<html><head><link rel=\"stylesheet\" href=\"file:///android_asset/style.css\" type=\"text/css\">"); builder.append("</link>"); builder.append("<script>"); builder.append("function scrollAnchor(id) {"); builder.append("window.location.hash = id;}"); builder.append("</script>"); builder.append("</head><body>"); builder.append(getThreadBody()); builder.append("</body></html>"); webContents.loadDataWithBaseURL("file:///android_asset/", builder.toString(), "text/html", "utf-8", null); Timer timer = new Timer(); timer.schedule(new TimerTask() { @Override public void run() { String id = "895884"; webContents.loadUrl("javascript:scrollAnchor(" + id + ");"); } } }, 250); 

    3 Solutions collect form web for “WebView salta all'ancora usando loadDataWithBaseUrl”

    Come controllarlo da JavaScript? Non l'ho provata, ma forse questo è un indizio.

     builder.append(getThreadBody()); builder.append("<script>window.location.hash="949823";</script>"); builder.append("</body></html>"); 

    Ricorda di abilitare javascript per WebView.

    —- Altre risposte —-

    Ho visto che si utilizza TimerTask per caricare il javascript, che funziona, ma credo che c'è un altro modo migliore. WebView ha un callback denominato onPageFinished e verrà triggersto quando WebView finisce di caricare la pagina web. Potresti iniettare il tuo JS.

     webContents.setWebViewClient(new WebViewClient(){ @Override public void onPageFinished(WebView view, String url) { String id = "895884"; webContents.loadUrl("javascript:scrollAnchor(" + id + ");"); } }); 

    Spero che questo sia utile!

    Prima di tutto, non è necessario utilizzare javascript. Se hai caricato contenuti

     webContents.loadDataWithBaseURL("some_dummy_url",...); 

    puoi semplicemente scorrere verso l'ancoraggio con

     webContents.loadUrl("some_dummy_url#anchor"); 

    In secondo luogo, farlo su OnPageFinished senza un controllo aggiuntivo in un ciclo senza fine! Quando il completamento di loadUrl suPageFinished viene chiamato ancora e ancora.

    se si carica l'html dai assets :

      webView.loadUrl("file:///android_asset/htmls/mypage.html#anchor"); 

    e puoi passare all'ancora all'interno di una pagina web:

     webView.loadUrl("http://www.stackoverflow.com/mypage.html#anchor"); 
    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.