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

时间:2010-06-14 17:50:56

标签: android webview anchor

我的Android App中有一个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", "");

7 个答案:

答案 0 :(得分:21)

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

答案 1 :(得分:15)

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

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

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

解决方案是在短暂延迟后加载网址。

以下是一个例子:

我的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毫秒)无法导航到链接。

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

答案 2 :(得分:6)

我的解决方案是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; 
                } 
            } 

        }); 
    } 
} 

答案 3 :(得分:2)

我有类似的问题。什么都不会跳转到html中的锚标签。我在ScrollView中没有我的WebView。相反,问题是我传入loadDataWithBaseURL的基本网址中没有冒号(':')。我相信baseUrl需要有一些文本,然后是冒号,然后是一些文本,例如“app:htmlPage24”。

所以这是对我的WebView的初始调用,只是为了在字符串HTML_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>

答案 4 :(得分:2)

Android 4.0中的WebView无法打开包含链接的网址。 例如     “文件:///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 + "';");
    }
}

答案 5 :(得分:1)

我也面临着同样的问题。锚链接跳到任意位置。确保在加载时不要隐藏webview

使用Invisible代替gone

此更改解决了我的问题。

答案 6 :(得分:0)

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

“测试!”必须在屏幕之外才能看到它的工作原理。