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

Joe*_*oel 24 anchor android webview

我的Android应用程序中有一个WebView,它使用loadDataWithBaseURL()方法加载HTML字符串.问题是本地锚链接(<a href="#link">...)无法正常工作.单击链接时,它将突出显示,但不会滚动到相应的锚点.

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

是否需要特殊处理才能使这些工作适用于WebView?

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

代码并不多,这里是我一直在使用的一些测试代码的相关部分:

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", "");
Run Code Online (Sandbox Code Playgroud)

Joe*_*oel 23

看起来问题是我在ScrollView中有一个WebView.当像这样配置时,WebView无法滚动到锚链接.在重构我的布局以消除ScrollView之后,锚链接正常工作.

  • UPS!=),在webview中滚动必须是自动的!所以我们不需要嵌套到Scrollview的好位置. (3认同)

Dav*_*arl 15

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

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

对我和显然其他人来说问题仍然是#LINK在从href中触摸启动时确实有效,但在通过URL启动时会被忽略.其他症状包括仅在会话中第一次导航到链接或导航到html文件的底部.

解决方案是在短暂延迟后加载URL.

这是一个例子:

我的html保存在资产中:res/assets/help.html

有这样的锚点:

<a name="helplinkcontacts"/>
Run Code Online (Sandbox Code Playgroud)

并加载如下:

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

我添加了这样的计时器:

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);
Run Code Online (Sandbox Code Playgroud)

注意:较短的延迟(例如100ms)无法导航到链接.

(*)事实证明,我们这么多人在ScrollViews中都有我们的WebViews,因为我们开始使用TextView渲染Spannable文本,它支持一些HTML并需要ScrollView.无论如何,只要将TextView转换为WebView,就可以删除ScrollView.

  • @"David Manpearl" 谢谢,你的回答解决了我的问题,和你描述的完全一样。投票了。注意:我只是使用了不同的方式来实现延迟:Handler handler = new Handler(); handler.postDelayed(new Runnable() { public void run() {mWebView.loadUrl(mUrlString);} }, 400); (2认同)

MKJ*_*ekh 6

我的解决方案是,检查此答案

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

        }); 
    } 
} 
Run Code Online (Sandbox Code Playgroud)