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.

  • Errore di connessione durante la lettura di tag Android NfcV
  • Map.clear () vs nuova mappa: Quale sarà meglio?
  • Come impostare il layout android per supportre tutte le size dello schermo?
  • Servizio Android riavviato quando l'applicazione viene uccisa
  • Come get l'accesso a tutte le tabs SD utilizzando la nuova API Lollipop?
  • SipApi non supportto da alcun dispositivo
  • 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.