单击 URL 会打开默认浏览器

Posted

技术标签:

【中文标题】单击 URL 会打开默认浏览器【英文标题】:Clicking URLs opens default browser 【发布时间】:2011-01-23 15:24:48 【问题描述】:

我在WebView 中加载了一个外部 URL。现在我需要的是,当用户单击加载页面上的链接时,它必须像普通浏览器一样工作,并以相同的WebView 打开链接。但它正在打开默认浏览器并在那里加载页面?

我已启用 javascript。但它仍然无法正常工作。我是不是忘记了什么?

【问题讨论】:

【参考方案1】:

如果您使用的是 WebView,如果您不想使用默认的 android 行为,则必须自己拦截点击。

您可以使用WebViewClient 监控WebView 中的事件。你想要的方法是shouldOverrideUrlLoading()。这允许您在选择特定 URL 时执行自己的操作。

您使用setWebViewClient() method 设置WebViewWebViewClient

如果您查看WebView sample in the SDK,就会有一个示例可以满足您的需求。很简单:

private class HelloWebViewClient extends WebViewClient 
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) 
        view.loadUrl(url);
        return true;
    

【讨论】:

看起来这是WebViewClient 的默认行为,如果您正在做这一切,则不需要子类化。我只是通过 myWebView.setWebViewClient(new WebViewClient()); 来实现这个功能 @dave-webb 请更新示例以不调用 loadUrl。阅读本文的每个人 - 请不要复制代码(从回调中返回 false 而不是调用 view.loadUrl)。调用 loadUrl 会引入一个微妙的错误,如果页面中有任何带有自定义方案 URL(例如 )的 iframe,它会将应用程序的主框架导航到该 URL,这很可能会破坏应用程序副作用。 @Adam ++ - 是的,我也注意到了这一点 - 我不明白为什么我的一个 Web 视图没有使用系统浏览器,这是因为我添加了一个新的 Web 客户端只是覆盖另一种方法。我花了一些时间来调试。 我们能否实现类似:onLongClick,在外部浏览器中打开链接?【参考方案2】:

API 24 中不推荐使用 boolean shouldOverrideUrlLoading(WebView view, String url) 方法。如果您支持新设备,则应使用 boolean shouldOverrideUrlLoading (WebView view, WebResourceRequest request)

您可以通过执行以下操作来同时使用两者:

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) 
    newsItem.setWebViewClient(new WebViewClient() 
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) 
            view.loadUrl(request.getUrl().toString());
            return true;
        
    );
 else 
    newsItem.setWebViewClient(new WebViewClient() 
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) 
            view.loadUrl(url);
            return true;
        
    );

【讨论】:

【参考方案3】:

官方documentation 说,单击 WebView 中的链接将启动处理 URL 的应用程序。您需要覆盖此默认行为

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

或者如果方法中没有条件逻辑,只需执行此操作

myWebView.setWebViewClient(new WebViewClient());

【讨论】:

【参考方案4】:

Arulx Z 的答案正是我想要的。

我正在编写一个带有可回收视图和 webviews 的 Navigation Drawer 的应用程序,以保持应用程序内的 web 浏览,而不管点击了超链接(因此不启动外部 web 浏览器)。为此,只需放置以下 2 行代码:

mWebView.setWebChromeClient(new WebChromeClient()); mWebView.setWebViewClient(new WebViewClient());

就在您的 WebView 声明下。

这是我实现的 WebView 代码示例:

public class WebView1 extends AppCompatActivity 

@Override
public void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    WebView wv = (WebView) findViewById(R.id.wv1); //webview statement
    wv.setWebViewClient(new WebViewClient());    //the lines of code added
    wv.setWebChromeClient(new WebChromeClient()); //same as above

    wv.loadUrl("http://www.google.com");

这样,网站中点击的每个链接都会加载到您的 WebView 中。 (使用更新了所有 SDK 的 Android Studio 1.2.2)

【讨论】:

这是最简单的方法。谢谢山姆【参考方案5】:

在您的代码中添加这 2 行 -

mWebView.setWebChromeClient(new WebChromeClient()); 
mWebView.setWebViewClient(new WebViewClient());

【讨论】:

【参考方案6】:

在某些情况下,如果您得到一个不会触发 url 加载方法的重定向,您可能需要覆盖 onLoadResource。在这种情况下,我尝试了以下方法:

@Override
public void onLoadResource(WebView view, String url)

    if (url.equals("http://redirectexample.com"))
    
        //do your own thing here
    
    else
    
        super.onLoadResource(view, url);
               

【讨论】:

这太棒了!为我节省了很多时间来尝试如何从 web 视图中的链接播放 MP3 文件。非常感谢 realgt!

以上是关于单击 URL 会打开默认浏览器的主要内容,如果未能解决你的问题,请参考以下文章

没有为请求的 URL 配置默认文档,并且没有在服务器上启用目录浏览?求解

如何在 Xamarin 中打开默认浏览器?

JLabel 超链接以正确的 URL 打开浏览器

在默认网络浏览器中打开 URL

Phonegap:在默认浏览器中打开 URL

OSX Swift 在默认浏览器中打开 URL