我已在我的WebView
中加载了一个外部URL。现在我需要的是,当用户点击加载页面上的链接时,它必须像普通浏览器一样工作,并打开同一个WebView
中的链接。但它打开默认浏览器并在那里加载页面?单击URL将打开默认浏览器
我已启用JavaScript。但仍然无法正常工作。我忘了什么吗?
我已在我的WebView
中加载了一个外部URL。现在我需要的是,当用户点击加载页面上的链接时,它必须像普通浏览器一样工作,并打开同一个WebView
中的链接。但它打开默认浏览器并在那里加载页面?单击URL将打开默认浏览器
我已启用JavaScript。但仍然无法正常工作。我忘了什么吗?
如果您使用的是WebView
你必须自己拦截点击,如果你不想在默认的Android行为。
您可以监视使用WebViewClient
在WebView
事件。你想要的方法是shouldOverrideUrlLoading()
。这允许您在选择特定URL时执行自己的操作。
您使用setWebViewClient()
method设置了WebView
的WebViewClient
。
如果你看一下WebView
sample in the SDK有一个例子,你想要的东西,其中一样。它是那样简单:
private class HelloWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
}
如果你不触发网址加载方法重定向你可能需要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);
}
}
官方documentation说,点击一个链接在网页视图将推出应用程序处理URL。你需要重写此默认行为
myWebView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
return false;
}
});
,或者如果没有条件逻辑的方法简单地做到这一点
myWebView.setWebViewClient(new WebViewClient());
在代码中添加这2条线 -
mWebView.setWebChromeClient(new WebChromeClient());
mWebView.setWebViewClient(new WebViewClient());
Arulx Z的回答正是我所期待的。
我正在写与抽屉式导航应用程序与recyclerview和网页视图,保持内部应用程序的网页浏览,无论超链接的点击(因此不启动外部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)
方法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;
}
});
}
看起来这是'WebViewClient'的默认行为,不需要子类,如果这是你正在做的。我只是通过执行'myWebView.setWebViewClient(新的WebViewClient());' – Adam 2012-10-07 20:25:32
@ dave-webb来更新示例以便不调用loadUrl。 每个人都在阅读 - 请不要复制代码(从回调中返回false而不是调用view.loadUrl)。调用loadUrl会引入一个细微的错误,如果您在页面内使用自定义方案URL(例如
@Adam ++ - 是的,我也注意到了这一点 - 我不明白为什么我的一个Web视图不使用系统浏览器,这是因为我已经添加了一个新的Web客户端,它只是重写ANOTHER方法。这花了我一段时间来调试。 – 2014-02-15 00:28:51