我已经在我的WebView加载了一个外部URL。现在我需要的是,当用户点击加载页面上的链接时,它必须像正常的浏览器一样工作,并在相同的WebView中打开链接。但它会打开默认浏览器并在那里加载页面?
我已经启用JavaScript。但还是不行。我忘记什么了吗?
我已经在我的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;
}
});
}