【发布时间】:2011-01-23 15:24:48
【问题描述】:
我在WebView 中加载了一个外部 URL。现在我需要的是,当用户单击加载页面上的链接时,它必须像普通浏览器一样工作,并以相同的WebView 打开链接。但它正在打开默认浏览器并在那里加载页面?
我已启用 JavaScript。但它仍然无法正常工作。我是不是忘记了什么?
【问题讨论】:
标签: android url android-webview android-websettings
我在WebView 中加载了一个外部 URL。现在我需要的是,当用户单击加载页面上的链接时,它必须像普通浏览器一样工作,并以相同的WebView 打开链接。但它正在打开默认浏览器并在那里加载页面?
我已启用 JavaScript。但它仍然无法正常工作。我是不是忘记了什么?
【问题讨论】:
标签: android url android-webview android-websettings
如果您使用的是 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;
}
}
【讨论】:
WebViewClient 的默认行为,如果您正在做这一切,则不需要子类化。我只是通过 myWebView.setWebViewClient(new WebViewClient()); 来实现这个功能
API 24 中不推荐使用 boolean shouldOverrideUrlLoading(WebView view, String url) 方法。如果您支持新设备,则应使用 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;
}
});
}
【讨论】:
官方documentation 说,单击 WebView 中的链接将启动处理 URL 的应用程序。您需要覆盖此默认行为
myWebView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
return false;
}
});
或者如果方法中没有条件逻辑,只需执行此操作
myWebView.setWebViewClient(new WebViewClient());
【讨论】:
Arulx Z 的答案正是我想要的。
我正在编写一个带有可回收视图和 webviews 的 Navigation Drawer 的应用程序,以保持应用程序内的 web 浏览,而不管点击了超链接(因此不启动外部 web 浏览器)。为此,只需放置以下 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 中。 (使用更新了所有 SDK 的 Android Studio 1.2.2)
【讨论】:
在您的代码中添加这 2 行 -
mWebView.setWebChromeClient(new WebChromeClient());
mWebView.setWebViewClient(new WebViewClient());
【讨论】:
在某些情况下,如果您得到一个不会触发 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);
}
}
【讨论】: