我在 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;
}
}
在某些情况下,如果您遇到一个重定向而不会触发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);
}
}
官方文档显示,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());
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;
}
});
}
Arulx Z的回答恰好符合我的需求。
我正在编写一个具有导航抽屉、recyclerview和webviews的应用程序,以便将网络浏览保留在应用程序内,而不管点击了哪个超链接(从而不启动外部Web浏览器)。为此,只需在WebView语句下面放置以下2行代码:
mWebView.setWebChromeClient(new WebChromeClient());
mWebView.setWebViewClient(new WebViewClient());
这样就可以实现了。
这是我已经实现的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)