Android Webview锚链接(跳转链接)不起作用

我在我的Android应用程序中使用loadDataWithBaseURL()方法加载HTMLstring中的WebView。 问题是本地锚链接( <a href="#link"> …)无法正常工作。 点击链接时,会突出显示,但不滚动到相应的锚点

如果我使用WebView的loadUrl()方法加载包含锚链接的页面,这也不起作用。 但是,如果我在浏览器中加载了相同的URL,则锚链接将起作用。

是否有任何特殊的处理需要得到这些工作的WebView?

我正在使用API​​ v4(1.6)。

代码没有太多,这里是我一直在处理的一些testing代码的相关部分:

 WebView detailBody = (WebView) findViewById(R.id.article_detail_body); String s = "<a href=\"#link\">LINK!</a><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><a name=\"link\"></a>Testing!"; detailBody.loadDataWithBaseURL(API.HomeURL(this), s, "text/html", "utf-8", ""); 

Related of "Android Webview锚链接(跳转链接)不起作用"

看起来问题是我有一个ScrollView中的WebView。 如果像这样configuration,WebView将无法滚动到锚点链接。 重构我的布局以消除ScrollView后,锚链接正常工作。

Android WebView锚链接(跳转链接)不起作用

确实,当WebView位于ScrollView(*)的内部时,WebView Anchor链接或通过URL的#LINK扩展启动的跳转链接将不起作用。

不过,对我和其他人来说,问题在于#LINK在通过href触摸启动时可以工作,但是通过URL启动时忽略。 其他症状包括仅在会话中第一次导航到链接或导航到HTML文件的底部。

解决scheme是在短暂的延迟后加载url。

这里是一个例子:

我的html被保存在资源:res / assets / help.html

像这样的锚点:

 <a name="helplinkcontacts"/> 

并加载像这样:

 final String baseUrl = "file:///android_asset/help.html#helplinkcontacts"; final WebView helpTextView = (WebView)findViewById(R.id.help_dialog_text); helpTextView.loadUrl(baseUrl); // Ignores Anchor!! 

我添加了这样的计时器:

 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); 

注意:较短的延迟(如100毫秒)无法导航到链接。

(*)事实certificate,我们很多人都有我们的WebViews在ScrollViews里面,因为我们开始使用一个TextView呈现Spannable文本,这两个文本都支持一些HTML并且需要一个ScrollView。 无论如何,只要您将TextView转换为WebView,即可移除ScrollView。

我的解决scheme是, 检查这个答案

 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; } } }); } } 

我有一个类似的问题。 没有什么会跳转到HTML中的锚定标签。 我在ScrollView中没有我的WebView。 相反,问题是我传递给loadDataWithBaseURL的基础url没有冒号(':')。 我相信baseUrl需要一些文本,然后冒号,然后一些文本,例如“app:htmlPage24”。

所以这里是对我的WebView的初始调用,只是为了加载stringHTML_24中的数据:

 wv.loadDataWithBaseURL("app:htmlPage24", HTML_24, "text/html", "utf-8", null); 

然后我有一个列表跳转到屏幕上的部分,这取决于你点击的列表项目:

 sectionsLV.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { wv.loadUrl("app:htmlPage24#section" + arg2); } }); 

HTML_24是这样的:

 <html> ... <a name="section1"/> ... <a name="section2"/> ... <a name="section3"/> ... </html> 

Android 4.0中的WebView无法打开包含链接的url。 例如“file:///android_asset/help.html#helplinkcontacts”

这是我如何解决这个问题

 WebView wv = (WebView) nagDialog.findViewById(R.id.wv); wv.getSettings().setJavaScriptEnabled(true); wv.setWebViewClient(new MyWebViewClient(link)); wv.loadUrl("file:///android_asset/help.html"); 

并定义自定义的WebViewClient类

 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 + "';"); } } 
 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); 

“testing!” 必须在屏幕之外才能看到它的作品。