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 打开新窗口的主要内容,如果未能解决你的问题,请参考以下文章
Flutter Webview - 在浏览器或窗口中打开外部链接
在 webview 中启用 Javascript 时,Android Webview 未检测到链接点击