Android WebView 在添加 WebViewClient 时忽略 target="_blank"

Posted

技术标签:

【中文标题】Android WebView 在添加 WebViewClient 时忽略 target="_blank"【英文标题】:Android WebView ignoring target="_blank" when added WebViewClient 【发布时间】:2014-11-19 19:34:30 【问题描述】:

我遇到了一个奇怪的问题。

在我的应用程序中,我需要从 assets 文件夹中加载基于 WebView 中单击按钮的静态 html 文件。

现在 5 个 html 文件中,一个 html 文件包含 15 个静态链接。这些链接需要将用户重定向到移动浏览器中提到的 url。为此,我在我的 html 文件中使用了target="_blank",如下所示。

<div class="lid"><a href="https://www.irctc.co.in/" target="_blank">Railway Reservation </a></div>

现在,这在一个简单的WebView 没有添加任何WebViewClient 的示例应用程序中运行良好。

但我需要一个WebViewClient 来使用我的其他功能。所以当时target="_blank" 完全被忽略了。并且 url 在 WebView 本身中打开。

我找到了一种解决方法,我可以使用shouldOverrideUrlLoading,如下所示:

myWebView.setWebViewClient(new WebViewClient()
    public boolean shouldOverrideUrlLoading(WebView view, String url) 
    // TODO Auto-generated method stub

        if(url.equalsIgnoreCase("https://www.irctc.co.in/"))
        
            view.getContext().startActivity(
                            new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
            return true;
        
        else
            return super.shouldOverrideUrlLoading(view, url);
    
);

所以这是在默认浏览器中打开该特定网址。

所以基本上我的问题是:

为什么在我们使用WebViewClient 时会忽略target="_blank"?这个问题还有其他解决方法吗?因为我有 15 个链接,我需要比较它们。我无法在新浏览器中加载所有 url,因为有一些链接,也需要在同一个 WebView 中打开。

【问题讨论】:

【参考方案1】:

我有一个解决方法的想法。将所有应在新窗口中打开的链接替换为自定义模式。然后你可以自己处理。

对于最小的中断集,还有一个自定义主题并处理所有配置更改:

<activity android:name="com.example.LinkHandler"
          android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"
          android:theme="@android:style/Theme.Translucent">
    <intent-filter>
        <action android:name="android.intent.action.VIEW"/>

        <category android:name="android.intent.category.DEFAULT"/>
        <category android:name="android.intent.category.BROWSABLE"/>

        <data android:scheme="your.link.handler.schema"/>
    </intent-filter>
</activity>

然后在您的链接处理程序中,您可以使用getIntent().getData() 读取网址。

还请记住,您应该处理 http 和 https,我在上面的简短示例中跳过了。

这是一个如何重写 url 的 javascript 示例:

for(var i=0; i<document.links.length; i++) 
    if(document.links[i].target == "_blank") 
        document.links[i].href = "your.schema.for."+document.links[i].href;
    
<ul>
    <li><a href="http://example.com">Test 1</a></li>
    <li><a href="http://example.net" target="_blank">Test 2</a></li>
    <li><a href="https://example.com" target="_blank">Test 3</a></li>
    <li><a href="https://example.net">Test 4</a></li>
</ul>

【讨论】:

如何用自定义架构替换链接?我不太清楚。 例如使用 javascript,您可以将一个小的 JavaScript 注入您的 webview 以重写链接。只需遍历所有链接并插入您的架构。 谢谢.. 我不得不使用比较,因为我的项目经理反对这一点。但我更喜欢这种解决方案:) PM 员工...优点是您可以跟踪点击次数。 嗯。到目前为止,我已将这 15 个 url 放入一个字符串数组中,并在 shouldOverrideUrlLoading 中进行比较。一旦有空闲时间,我将尝试这种方法。

以上是关于Android WebView 在添加 WebViewClient 时忽略 target="_blank"的主要内容,如果未能解决你的问题,请参考以下文章

Android WebView 获取网页的标题

为啥 Youtube 视频没有在 webview android 中播放

Android开发基础之控件WebView

Android开发基础之控件WebView

为啥Android WebView会显示黑屏?

使用 webview 和刷新按钮加载 android