单击URL将打开默认浏览器


209

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

我启用了JavaScript。但仍然无法正常工作。我忘记了什么吗?

Answers:


353

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

您可以监视的事件WebView使用WebViewClient。您想要的方法是shouldOverrideUrlLoading()。这样,当您选择特定的URL时,您可以执行自己的操作。

WebViewClient可以WebView使用setWebViewClient()方法设置

如果您查看WebViewSDK中的示例,则有一个示例可以满足您的需求。就像这样简单:

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

97
看起来这是默认行为,WebViewClient如果您正在做的话,则不需要子类化。我得到这个工作刚刚做myWebView.setWebViewClient(new WebViewClient());
亚当

7
@ dave-webb,请将示例更新为不调用loadUrl。所有人都在阅读此内容-请不要复制代码(从回调函数返回false而不是调用view.loadUrl)。调用loadUrl会引入一个细微的错误,即如果页面中有任何带有自定义方案URL的iframe(例如<iframe src =“ tel:123” />),它将在应用程序的主框架中导航到该URL,很可能会破坏应用程序为副作用。
marcin.kosiba,2014年

1
@Adam ++-是的,我也注意到了这一点-我不明白为什么我的一个Web视图未使用系统浏览器,这是因为我向其添加了一个新的Web客户端,而该Web客户端仅覆盖了另一个方法。这花了我一段时间来调试。
彼得·阿杰泰

我们可以实现类似的方法:onLongClick,在外部浏览器中打开链接吗?
TheOnlyAnil 2015年

54

在某些情况下,如果您获得的重定向不会触发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!
Brigante

25

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

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

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

myWebView.setWebViewClient(new WebViewClient());

15

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

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

9

boolean shouldOverrideUrlLoading(WebView view, String url)API 24中已弃用该方法。如果要支持新设备,则应使用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;
        }
    });
}

6

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

我正在使用带有带有recyclerview和webviews的Navigation Drawer编写应用程序,以使Web浏览保持在应用程序内部,而不管单击了超链接如何(因此不会启动外部Web浏览器)。为此,只需放置以下两行代码即可:

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)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.