WebViewClientでアンカーリンクのタップをフックする
あまりないケースだと思いますが、AndroidのWebViewでWeb画面上のアンカーリンク (ページ内リンク)のタップをフックして、そのタイミングでアプリ側で何か動作させたい時の備忘録です。
例: WebViewをScrollViewに含めるとアンカーリンクが効かなくなるので、アンカーリンクのタップをアプリ側でフックして、ScrollViewをスクロールさせたい
WebViewとネイティブのViewを一緒にスクロールさせたい時に上のような実装にすることがあります
ハマった点: WebViewClientのshouldOverrideUrlLoadingはページ内リンクのタップでは呼ばれない
最初はWebViewClientのshouldOverrideUrlLoadingでUrl見てページ内リンクだった時にどうこうすればいいじゃん!って思ってたんですが、shouldOverrideUrlLoadingは同一ページ内のリンクの場合呼ばれないんですね...
解決: WebViewClientのonPageFinishedなら呼ばれる
ページ内リンクのタップ時にshouldOverrideUrlLoadingは呼ばれませんがonPageFinishedが呼ばれます。
引数でUrlも取れるので、ここでどうこうしてあげれば大丈夫です。
例えばページ内リンクが以下のような感じだとします。
<a href="#top">一番上に戻る</a>
WebViewClientを使って以下のように記述すればOKです
webView.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url) {
if(url.contains("#top")) {
/** ここにしたいことを書く **/
}
}
});
以上です。