单击 URL 会打开默认浏览器
Posted
技术标签:
【中文标题】单击 URL 会打开默认浏览器【英文标题】:Clicking URLs opens default browser 【发布时间】:2011-01-23 15:24:48 【问题描述】:我在WebView
中加载了一个外部 URL。现在我需要的是,当用户单击加载页面上的链接时,它必须像普通浏览器一样工作,并以相同的WebView
打开链接。但它正在打开默认浏览器并在那里加载页面?
我已启用 javascript。但它仍然无法正常工作。我是不是忘记了什么?
【问题讨论】:
【参考方案1】:如果您使用的是 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());
来实现这个功能
@dave-webb 请更新示例以不调用 loadUrl。阅读本文的每个人 - 请不要复制代码(从回调中返回 false 而不是调用 view.loadUrl)。调用 loadUrl 会引入一个微妙的错误,如果页面中有任何带有自定义方案 URL(例如 )的 iframe,它会将应用程序的主框架导航到该 URL,这很可能会破坏应用程序副作用。
@Adam ++ - 是的,我也注意到了这一点 - 我不明白为什么我的一个 Web 视图没有使用系统浏览器,这是因为我添加了一个新的 Web 客户端只是覆盖另一种方法。我花了一些时间来调试。
我们能否实现类似:onLongClick,在外部浏览器中打开链接?【参考方案2】:
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;
);
【讨论】:
【参考方案3】:官方documentation 说,单击 WebView 中的链接将启动处理 URL 的应用程序。您需要覆盖此默认行为
myWebView.setWebViewClient(new WebViewClient()
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url)
return false;
);
或者如果方法中没有条件逻辑,只需执行此操作
myWebView.setWebViewClient(new WebViewClient());
【讨论】:
【参考方案4】: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)
【讨论】:
这是最简单的方法。谢谢山姆【参考方案5】:在您的代码中添加这 2 行 -
mWebView.setWebChromeClient(new WebChromeClient());
mWebView.setWebViewClient(new WebViewClient());
【讨论】:
【参考方案6】:在某些情况下,如果您得到一个不会触发 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);
【讨论】:
这太棒了!为我节省了很多时间来尝试如何从 web 视图中的链接播放 MP3 文件。非常感谢 realgt!以上是关于单击 URL 会打开默认浏览器的主要内容,如果未能解决你的问题,请参考以下文章