Android WebView 链接到同一个窗口,target=_blank 打开新窗口

Posted

技术标签:

【中文标题】Android WebView 链接到同一个窗口,target=_blank 打开新窗口【英文标题】:Android WebView links to same window with target=_blank to open new window 【发布时间】:2015-01-16 13:36:22 【问题描述】:

我有一个混合应用程序,它使用 WebView 从我自己的网站呈现外部 html。它有一个问题,如果单击任何链接,它会启动一个浏览器窗口。我找到了这段代码来帮助我,它可以工作:

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

但现在的问题是我希望它不适用于其中包含 target=_blank 的链接。所以任何正常的链接仍然在 WebView 中打开,而带有 target=_blank 的链接应该在新的浏览器窗口中打开。

我们有什么方法可以做到这一点?

谢谢

【问题讨论】:

【参考方案1】:

首先,

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;
    

【讨论】:

恐怕你不是很了解。 target=_blank 不是 url 中的东西,它是 html 锚标记的属性。像这样:example.comtarget=_blank>点击这里我认为这很明显! 更改了代码,从未在 HTML 上工作过,所以经过一番搜索后发现了这个目标。道歉。 感谢更新代码,新代码无法解析 WebViewActivity2。它属于哪个包? 这段代码仅供参考,这里需要使用自己的activity名称,或者传递app的上下文。 使用我自己的活动名称等后,代码似乎不起作用。它没有给出错误,但也没有达到我想要的。所以我想我将不得不放弃这个方法并简单地使用一个提示,如果 url 包含一个特定的字符串(在我的例子中是“重定向”),那么我使用你提供的旧代码来初始化浏览器意图并取消这个调用.我希望它会奏效。我接受你的回答,因为它确实帮助我理解了这件事。谢谢。【参考方案2】:

试试这个。

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

【讨论】:

这对我很有帮助,我错过了获取 URL 的 getHitTestResult().getExtra()。非常感谢!【参考方案3】:

除了 myWebView.getSettings().setSupportMultipleWindows(true) 之外,webview 还需要一个设置; myWebView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);

【讨论】:

应该是:myWebView.getSettings().setjavascriptCanOpenWindowsAutomatically(true); 请将其更正为 getStettings() 但它不起作用【参考方案4】:

使用 kotlin

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

【讨论】:

以上是关于Android WebView 链接到同一个窗口,target=_blank 打开新窗口的主要内容,如果未能解决你的问题,请参考以下文章

单击链接时,Android WebView 崩溃

Flutter Webview - 在浏览器或窗口中打开外部链接

在 webview 中启用 Javascript 时,Android Webview 未检测到链接点击

Android程序中嵌入WebView,单击其中的链接时无反应,请问是啥原因引起的?如何解决?

使用javascript杀死webview浏览器窗口

Android 有一个界面就是一个webView,这个webView链接的网页打开之后,网页自身会有定位功能