私のAndroidアプリは、WebViewを使用して、「オンザフライ」で生成した一連のHTMLコードを表示します。HTMLコードは、次のコードを使用してロードされます。
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);
これはすべて本当にうまく機能します。私は実際のHTMLファイルをロードしているのではなく、いくつかの(うまくいけば有効な)HTMLを表す文字列を作成し、それをWebViewにロードしているだけであることに注意してください。
とにかく、私が生成するHTML('getThreadBody'メソッドの一部)には、たとえば次のような名前付きアンカーが含まれています。
<div>
<a name="949823">Anchor 1</a>
<div>All kinds of stuff</div>
<a name="895984">Anchor 2</a>
<div>...</div>
</div>
場合によっては、HTMLをロードするとすぐにWebViewがこれらのアンカーの1つに移動するようにしたいことがあります。WebViewが名前付きアンカーへのナビゲート(この場合はスクロール)をサポートしていることを理解している限り、キャッチは、誰もそれらのアンカーへのハイパーリンクをクリックしていないということです。WebViewがロードされたときにスクロールする必要があります(そこにある場合は問題ありません) HTMLの読み込みとスクロールの間の短い遅延です。私のポイントは、ユーザーの操作を必要としないことです)。
この動作は、WebViewのloadUrlメソッドを使用し、アンカーが配置されたURLを提供することで実現できると思います。
webview.loadUrl("file:///android_asset/page.html#895984", ...)
ただし、HTMLをどのファイルにも保存していないため、この方法は使用できません...もちろん、HTMLを一時ファイルに保存することも解決策かもしれませんが、最後の手段としてそれを維持したいので、もっと簡単な方法?
どうすればこれを達成できますか?ありがとう!
解決済み これが機能するコードです。javascriptを実行する前にページをロードするために短い遅延が必要であることがわかりました。そうでない場合は、機能するかどうかにかかわらず、50/50のようなものでした...
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);