单击URL将打开默认浏览器

JaV*_*did 206 url android android-webview android-websettings

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

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

Dav*_*ebb 347

如果你正在使用,WebView如果你不想要默认的Android行为,你必须自己拦截点击.

您可以WebView使用a 监控事件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;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 看起来这是`WebViewClient`的默认行为,如果这就是你正在做的事情,则不需要子类化.我只是通过`myWebView.setWebViewClient(new WebViewClient());`来实现这一点 (96认同)
  • @ dave-webb请更新示例以不调用loadUrl.阅读本文的每个人 - 请不要复制代码(从回调中返回false而不是调用view.loadUrl).调用loadUrl会引入一个微妙的错误,如果你在页面中有任何iframe,并带有自定义方案URL(比如说<iframe src ="tel:123"/></iframe>),它会将你应用程序的主框架导航到最有可能破坏应用程序的URL副作用. (7认同)

rea*_*lgt 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);
    }           
}
Run Code Online (Sandbox Code Playgroud)


abb*_*bas 25

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

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

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

myWebView.setWebViewClient(new WebViewClient());
Run Code Online (Sandbox Code Playgroud)


Con*_*use 14

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

mWebView.setWebChromeClient(new WebChromeClient()); 
mWebView.setWebViewClient(new WebViewClient());?
Run Code Online (Sandbox Code Playgroud)


Chr*_*ell 8

该方法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;
        }
    });
}
Run Code Online (Sandbox Code Playgroud)


小智 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");
}}
Run Code Online (Sandbox Code Playgroud)

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