Android WebView将target=_blank的链接指向同一窗口以打开新窗口

17

我有一个混合应用程序,使用WebView来渲染来自我的网站的外部HTML。 它存在一个问题,如果单击任何链接,它将启动一个浏览器窗口。 我找到了这段代码来帮助我解决问题,并且它有效:

    myWebView.setWebViewClient(new WebViewClient(){
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            view.loadUrl(url);
            return false;
        }
    });

但现在的问题是,我希望它不对具有target=_blank属性的链接起作用。因此,任何普通链接仍将在WebView内部打开,而具有target=_blank属性的链接应在新浏览器窗口中打开。

我们有办法做到这一点吗?

谢谢

4个回答

39

首先,在mWebView.getSettings().setSupportMultipleWindows(true);中设置支持多窗口。

然后,在WebChromeClient中,重写OnCreateWindow()方法。

    private class MyWebChromeclient extends WebChromeClient {


    @Override
    public boolean onCreateWindow(WebView view, boolean isDialog,
            boolean isUserGesture, Message resultMsg) {

            WebView newWebView = new WebView(WebViewActivity2.this);
            view.addView(newWebView);
            WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj;
            transport.setWebView(newWebView);
            resultMsg.sendToTarget();

            newWebView.setWebViewClient(new WebViewClient() {
                @Override
                public boolean shouldOverrideUrlLoading(WebView view, String url) {
                    Intent browserIntent = new Intent(Intent.ACTION_VIEW);
                    browserIntent.setData(Uri.parse(url));
                    startActivity(browserIntent);
                    return true;
                }
            });
        return true;
    }

感谢更新的代码,新代码并未解决WebViewActivity2的问题。它属于哪个包? - mim
这段代码仅供参考,您需要在此处使用自己的活动名称或传递应用程序的上下文。 - Darpan
1
你可以使用view.getContext()代替WebViewActivity2.this - tolbard
1
@Spritzig 需要ACTION_VIEW以便安卓系统能够提供可以处理该内容类型的应用程序,如浏览器。 - Darpan
1
shouldOverrideUrlLoading 在这里从未被调用。有什么建议吗? - ono
显示剩余6条评论

16

尝试这个。

myWebView.getSettings().setSupportMultipleWindows(true);
myWebView.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;
    }
});

参考:Carson Ip


这真的帮了我很多,我之前漏掉了getHitTestResult().getExtra()来获取URL。 非常感谢! - dev2505

1

使用 Kotlin

myWebView.settings.javaScriptEnabled = true
myWebView.settings.javaScriptCanOpenWindowsAutomatically = true

0
除了使用myWebView.getSettings().setSupportMultipleWindows(true)外,WebView还需要设置一个附加项: myWebView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true); 这样可以使JavaScript自动打开窗口。

应该是: myWebView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true); - David Papirov
1
请将其更正为 **getSettings()**,但它无法工作。 - Mori

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接