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

我已经启用JavaScript。但还是不行。我忘记什么了吗?


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

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

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

如果你看一下SDK中的WebView示例,有一个例子就是你想要的。其实很简单:

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

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

@Override
public void onLoadResource(WebView view, String url)
{
    if (url.equals("http://redirectexample.com"))
    {
        //do your own thing here
    }
    else
    {
        super.onLoadResource(view, url);
    }           
}

官方文档说,点击WebView中的链接将启动处理url的应用程序。您需要重写此默认行为

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

或者如果方法中没有条件逻辑,则简单地这样做

myWebView.setWebViewClient(new WebViewClient());

在代码中添加这两行-

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

Arulx Z的答案正是我一直在寻找的。

我写了一个应用程序与导航抽屉与recyclerview和webviews,保持网页浏览内的应用程序无论超链接点击(因此不启动外部网页浏览器)。为此,只需放入以下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中。 (使用Android Studio 1.2.2,所有SDK已更新)


方法布尔shouldOverrideUrlLoading(WebView view, String url)在API 24中被弃用。如果你支持新设备,你应该使用布尔shouldOverrideUrlLoading (WebView视图,WebResourceRequest请求)。

你可以这样使用它们:

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;
        }
    });
}