首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >WebView放弃到活动管理器的rel=external链接

WebView放弃到活动管理器的rel=external链接
EN

Stack Overflow用户
提问于 2012-01-09 04:38:11
回答 3查看 1.1K关注 0票数 0

我有一个WebView,其中我想与rel=external锚标签打开在安卓浏览器,但所有其他链接留在WebView中。

因此,如果用户点击其标记如下的链接,则内容将加载到WebView中:

代码语言:javascript
运行
复制
<a href="http://example.com/">Whatever</a>

但是,如果用户点击一个标记如下的链接,内容将加载到Android浏览器中:

代码语言:javascript
运行
复制
<a href="http://example.com/" rel="external">Whatever</a>

下面是我在WebViewClient代码中的相关代码(带有一小段用注释标识的伪代码):

代码语言:javascript
运行
复制
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
    if (! rel=external) {   //  <-- That condition...how do I do that?
        view.loadUrl(url);
        return false;
    } else {
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.setData(Uri.parse(url));
        startActivity(intent);
        return true;
    }

确定是否有rel=external属性/值的最好方法是以某种方式使用addJavascriptInterface(),并让JavaScript通知JavaScript是否有rel属性以及值是什么?

还是有更好的方法?

(我正在寻找一种不涉及检查URL的域的解决方案,因为有任意数量的域需要被视为内部的,而我不能提前知道,也不能轻松地动态确定。)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-01-20 10:50:19

我认为,如果您不想修改现有的URL,那么您的原始建议的变体可能是最好的。

使用addJavaScriptInterface添加一个类来处理外部URL加载。内部类可能如下所示:

代码语言:javascript
运行
复制
public class JavaScriptInterface {
    public void viewExternalUrl(String url) {
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.setData(Uri.parse(url));
        startActivity(intent);
        return true;
    }
}

当然,还要加上它:

代码语言:javascript
运行
复制
webView.addJavascriptInterface(new JavaScriptInterface(), "Android");

注入JavaScript以添加单击处理程序,以便在通过loadUrl加载页面后调用您的JavaScript接口(为了简单起见,使用JQuery )。您可以通过创建自定义WebViewClient并覆盖onPageFinished来检测页面加载完成。

代码语言:javascript
运行
复制
webView.setWebViewClient(new WebViewClient() {
    private static final String sJs = "javascript:" +
        Uri.encode("$('a[@rel$='external']').click(function(){ Android.viewExternalUrl($(this).attr('href')); });");

    @Override
    public void onPageFinished(WebView view, String url) {
        webView.loadUrl(sJs);
    }
}

我还没有测试过这些代码,但是假设您已经在页面中加载了JQuery,它应该可以工作。如果不是这样,您可能会想出一些JavaScript来操作DOM而不使用它,或者您可以在加载JQuery之前先使用loadUrl手动加载JavaScript。

请注意,这种方法完全放弃了对shouldOverrideUrlLoading的任何使用

票数 2
EN

Stack Overflow用户

发布于 2012-01-09 04:54:33

我的建议是使用一种不同的方式指定外部URL...它将该信息嵌入到URL中,因此与shouldOverrideUrlLoading函数兼容。具体地说,创建自定义方案URL并将实际页面作为参数传递:

myappname://external?url=encoded_real_page_url

然后在shouldOverrideUrlLoading函数中检查它是否是自定义方案URL,提取url参数,解码它,然后重定向。

票数 1
EN

Stack Overflow用户

发布于 2012-01-14 19:31:31

如果你可以控制服务器端的内容,那么一定要按照Theo的建议去做。由于您指出页面也应该在标准浏览器中加载,所以不要使用自定义方案,而是将rel=external作为您链接/重定向到的实际url的一部分。

通过这样做,您可以轻松地解析shouldOverrideUrlLoading(WebView view, String url)中的url参数并检查上面的键/值对。我建议您将其解析为Uri,并使用getQueryParameter(key)检查与rel匹配的值。如果是external,就发出一个意图。

它看起来像这样:

代码语言:javascript
运行
复制
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
    Uri uri = Uri.parse(url);
    String relValue = uri.getQueryParameter("rel");    
    if (relValue != null && !relValue.equals("external")) {
        view.loadUrl(url);
        return false;
    }
    Intent intent = new Intent(Intent.ACTION_VIEW);
    intent.setData(uri);
    startActivity(intent);
    return true;
}

注意:不需要声明'else‘,因为你已经从'if’中的方法返回了。

如果用户可以使用你的WebView访问任何网站,如果你对其他网站使用相同的键/值来达到他们的目的有疑虑,你可以很容易地添加另一个检查,以确定url是否在你的域中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8781081

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档