I was also facing the same issue. Anchor link was jumping to arbitrary position. Make sure not to hide webview when loading.
Use Invisible instead of gone.
This change fixed my issue.
True, WebView Anchor Links, or Jump Links initiated through the #LINK extension to the URL will not work when the WebView is inside of a ScrollView(*).
Still, the problem for me and apparently others is that the #LINK does work when launched from a touch in an href, but is ignored when launched via the URL. Other symptoms include navigating to the link only on the first time in a session or navigating to the bottom of the html file.
The Solution is to load the url after a short delay.
Here is an example:
My html is saved in assets: res/assets/help.html
With anchors like this:
<a name="helplinkcontacts"/>
And loaded like this:
final String baseUrl = "file:///android_asset/help.html#helplinkcontacts";
final WebView helpTextView = (WebView)findViewById(R.id.help_dialog_text);
helpTextView.loadUrl(baseUrl); // Ignores Anchor!!
I added the timer like this:
final String baseUrl = "file:///android_asset/help.html#helplinkcontacts";
final WebView helpTextView = (WebView)findViewById(R.id.help_dialog_text);
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
helpTextView.loadUrl(baseUrl);
}
}, 400);
Note: Shorter delays, such as 100ms failed to navigate to the link.
(*) It turns out that so many of us have our WebViews inside of ScrollViews because we started out with a TextView rendering Spannable text which both supports some HTML and requires a ScrollView. Anyways, remove the ScrollView as soon as you convert your TextView into a WebView.
try this
String myTemplate = "<a href=\"#link\">LINK!</a><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><a name=\"link\"></a>Testing!";
myWebView.loadDataWithBaseURL(null, myTemplate, "text/html", "utf-8", null);
the word "Testing!" must be outside of the screen to see it works.
WebView in Android 4.0 fails to open URLs with links in them. e.g. "file:///android_asset/help.html#helplinkcontacts"
Here is how I got around it
WebView wv = (WebView) nagDialog.findViewById(R.id.wv);
wv.getSettings().setJavaScriptEnabled(true);
wv.setWebViewClient(new MyWebViewClient(link));
wv.loadUrl("file:///android_asset/help.html");
And define the custom WebViewClient class
class MyWebViewClient extends WebViewClient {
private String link;
public MyWebViewClient(String link) {
this.link = link;
}
@Override
public void onPageFinished(WebView view, String url) {
if (!"".equals(link) && link != null)
view.loadUrl("javascript:location.hash = '#" + link + "';");
}
}
My Solution is , Check this Answer
public class MainActivity extends Activity {
WebView myWebView;
public static boolean flag = false;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
myWebView = new WebView(this);
myWebView.getSettings().setJavaScriptEnabled(true);
myWebView.loadUrl("file:///android_asset/chapters.html");
setContentView(myWebView);
myWebView.setWebViewClient(new WebViewClient() {
public void onPageFinished(WebView view, String url) {
if (url.contains("#") && flag == false) {
myWebView.loadUrl(url);
flag = true;
} else {
flag = false;
}
}
});
}
}
It looks like the problem is that I had a WebView within a ScrollView. The WebView isn't able to scroll to an anchor link when configured like this. After refactoring my layout to eliminate the ScrollView, the anchor links work correctly.