Android - 使用外部浏览器在 WebView 中打开目标 _blank 链接

Posted

技术标签:

【中文标题】Android - 使用外部浏览器在 WebView 中打开目标 _blank 链接【英文标题】:Android - Open target _blank links in WebView with external browser 【发布时间】:2013-08-13 19:22:29 【问题描述】:

我建立了一个 WebView 来显示一个网站。该网站包含没有target="_blank" 属性的链接和一些带有它的链接。

我需要打开在外部标准设备浏览器中定义的带有target 的链接以及在WebView 中没有它的链接。

我正在使用WebViewClient,并尝试使用此功能,但我的所有链接仍然在WebView 中打开:

备选方案 1:

@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) 

    return super.shouldOverrideUrlLoading(view, url);        

备选方案 2:

@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) 

    view.loadUrl(url);
    return true;        

有人知道我如何在外部打开空白链接吗?

谢谢!

PS:为避免误解:我不能使用this approach,因为我知道应该在外部打开链接的唯一方法是target 属性。

【问题讨论】:

当url包含属性target="_blank"你得到答案了吗?? 【参考方案1】:

访问上述链接后,我想出了这段代码,希望对您有所帮助。

wv.getSettings().setSupportMultipleWindows(true);
wv.setWebChromeClient(new WebChromeClient() 
    @Override
    public boolean onCreateWindow(WebView view, boolean dialog, boolean userGesture, android.os.Message resultMsg)
    
        WebView.HitTestResult result = view.getHitTestResult();
        String data = result.getExtra();
        Context context = view.getContext();
        Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(data));
        context.startActivity(browserIntent);
        return false;
    
);

【讨论】:

了解 onCreateWindow 何时触发很重要。请参阅link 以更好地了解 有没有办法用常规的 webviewclient 做到这一点? 有时data 为空 这个解决方案几乎是完美的。除此之外,当图片被点击时, 元素中的图片会在新窗口中打开,而 不会像预期的那样。 文档说“如果宿主应用程序将创建一个新窗口,此方法应返回 true”。【参考方案2】:

我遇到了同样的问题。我想在应用程序中打开我的网站页面,其余所有页面都应该在默认浏览器中打开。我使用了一种技术。如果 URL 包含我的网站名称,那么我在 WebView 中打开它并保留在默认浏览器中打开的所有网站。

找到下面的代码,希望对所有遇到此类问题的人有用。

private class MyBrowser extends WebViewClient 
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) 
        if (url.contains("/internetgeeks")) 
            browser.loadUrl(url);
            return false;
         else 
            Intent intent = new Intent(Intent.ACTION_VIEW);
            intent.setData(Uri.parse(url));
            startActivity(intent);
            return true;
        
    

【讨论】:

Carson-ip 的答案更好:它会按要求处理 target="_blank" 只是为了补充答案,startActivity 对我不可用,我打电话给intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 并通过view.Context.ApplicationContext.StartActivity(intent); 调用活动【参考方案3】:

我也遇到了同样的问题,现在我找到了解决办法。

你还需要使用WebChromeClient。你可以看到this和this。 您可以将 WebViewClient 设置为新的 WebView 并覆盖 shouldOverrideUrlLoading 方法,然后您可以获取 url 并在这里做任何您想做的事情。如果您不设置 WebViewClient,我认为它也应该可以工作。就我而言,我想获取 url,所以我将 WebViewClient 设置为新的 WebView。

顺便说一句,如果你删除了旧的 webview,那么当你从浏览器返回时,webview 是空白的。所以我保留了 webview 并添加了一个新的,但将可见性设置为“已消失”。

【讨论】:

【参考方案4】:
private  WebView WEB_v;

如果您在任何第二个窗口中单击链接时打开新窗口,那么我将通过另一个浏览器打开它

 WEB_v.getSettings().setSupportMultipleWindows(true);
    WEB_v.setWebChromeClient(new WebChromeClient() 
        @Override
        public boolean onCreateWindow(WebView view, boolean dialog, boolean userGesture, android.os.Message resultMsg)
        
            WebView.HitTestResult result = view.getHitTestResult();
            String data = result.getExtra();
            Context context = view.getContext();
            Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(data));
            context.startActivity(browserIntent);
            return false;
        
    );

【讨论】:

【参考方案5】:

如果您只想使用 javascript 来执行此操作,那么这是我打开从 android 或 ios 应用程序的 webview 到外部浏览器的任何链接的解决方案。

在查询参数中使用“open=outside”修改了您的 URL。

即。 https://example.com/homePage?open=outside

【讨论】:

以上是关于Android - 使用外部浏览器在 WebView 中打开目标 _blank 链接的主要内容,如果未能解决你的问题,请参考以下文章

android-launch 外部浏览器并使用返回按钮返回应用程序

Android WebView是否需要打开外部URL的权限?

Android - 如何使用新的存储访问框架将文件复制到外部 sd 卡

Video.js无法播放本地视频?

如何在网络视图android中填写字段

javascript 提供用于从React-Native WebView发送和接收消息的示例实现(使用postMessage / onMessage WebVie)