Moja aplikacja na Androida korzysta z WebView, aby wyświetlać zestaw kodu HTML, który generuję "w locie". Kod HTML jest ładowany za pomocą następującego kodu:Skok WebView do zakotwiczenia za pomocą metody 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);
To wszystko działa naprawdę ładnie. Zauważ, że nie ładuję rzeczywistego pliku HTML, tylko tworzę ciąg znaków, który reprezentuje jakiś (miejmy nadzieję, poprawny) HTML i ładuję go w WebView.
W każdym razie wygenerowany przeze mnie HTML (część w metodzie "getThreadBody") zawiera nazwane kotwice, na przykład w ten sposób;
<div>
<a name="949823">Anchor 1</a>
<div>All kinds of stuff</div>
<a name="895984">Anchor 2</a>
<div>...</div>
</div>
Teraz w niektórych przypadkach Chcę WebView, aby przejść do jednego z tych kotwic jak najszybciej załadować HTML. O ile rozumiem, WebView obsługuje nawigację (przewijanie w tym przypadku) do nazwanych kotwic, ale złapanie jest takie, że nikt nie klika żadnych hiperłączy do tych kotwic, chcę, żeby WebView przewijał się po załadowaniu (nie ma problemu, jeśli jest tam jest krótkie opóźnienie między ładowaniem HTML a przewijaniem, moim celem jest to, że nie powinno to wymagać interakcji użytkownika).
Uważam, że zachowanie można osiągnąć stosując metodę loadUrl w Webview i dostarczanie URL z kotwicy w miejscu, np
webview.loadUrl("file:///android_asset/page.html#895984", ...)
Jednakże, ponieważ nie jestem zapisywania HTML do dowolnego pliku nie mogę używać ta metoda ... Oczywiście zapisanie kodu HTML do pliku tymczasowego może być rozwiązaniem, ale chciałbym zachować to w ostateczności, musi być prostszy sposób?
Jak mogę to osiągnąć? Dzięki!
Rozwiązane Oto kod, który działa. Znalazłem krótkie opóźnienie było konieczne aby strona załadowała się przed wykonaniem JavaScript inaczej to był rodzaj 50/50 czy to działa czy nie ...
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);
Nie wiedziałem, że to możliwe, dzięki! –
Tylko jedna uwaga, przy korzystaniu z tego URL strony internetowej nie zmienia się. webview.getUrl() zwraca ten sam URL, który został użyty do załadowania zawartości. – Codebeat
Możesz również użyć javascript do obsługi wymiany danych za pomocą zdarzenia hashchange: $ j (window) .bind ('hashchange', function (e) {do twoich rzeczy tutaj} – Codebeat