La mia app Android utilizza una WebView per visualizzare un mucchio di codice HTML che io genera "al volo". Il codice HTML viene caricato utilizzando il seguente codice:WebView salta per ancorare utilizzando loadDataWithBaseUrl
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 davvero bene. Nota che non sto caricando un vero file HTML, sto semplicemente creando una stringa che rappresenta un codice HTML (si spera valido) e lo carica nella WebView.
In ogni caso, l'HTML I generato (la parte nel metodo 'getThreadBody') contiene ancore con nome, ad esempio in questo modo;
<div>
<a name="949823">Anchor 1</a>
<div>All kinds of stuff</div>
<a name="895984">Anchor 2</a>
<div>...</div>
</div>
Ora, in alcuni casi, voglio il WebView per navigare ad una di quelle ancore non appena si carica il codice HTML. Per quanto ne so, WebView supporta la navigazione (scorrendo in questo caso) alle ancore con nome, ma il problema è che nessuno fa clic su nessun collegamento ipertestuale a tali ancore, voglio che la WebView scorra quando viene caricata (non c'è problema se è un breve ritardo tra il caricamento dell'HTML e lo scorrimento, il mio punto è che non dovrebbe richiedere l'interazione dell'utente).
Credo che il comportamento può essere ottenuto utilizzando il metodo loadURL del WebView e fornendo un URL con l'ancora in atto, per esempio
webview.loadUrl("file:///android_asset/page.html#895984", ...)
Tuttavia, dato che non sto salvando il codice HTML a qualsiasi file non posso usare questo metodo ... Naturalmente salvare l'HTML in un file temporaneo può essere una soluzione, ma mi piacerebbe tenerlo come ultima risorsa, ci deve essere un modo più semplice?
Come posso ottenere questo risultato? Grazie!
Risolto Ecco il codice che funziona. Ho trovato un piccolo ritardo è stato richiesto di lasciare che il caricamento della pagina prima di eseguire il javascript altrimenti era una sorta di 50/50 se ha funzionato 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);
Non sapevo che fosse possibile, grazie! –
Solo una nota, quando si utilizza questo l'URL della visualizzazione Web non cambia. webview.getUrl() restituisce lo stesso URL utilizzato per caricare il contenuto. – Codebeat
Puoi anche usare javascript per gestire l'haschange usando l'evento hashchange: $ j (window) .bind ('hashchange', function (e) {fai la tua roba qui} – Codebeat