如何在webview中打开链接或根据域名默认打开浏览器?

时间:2011-02-05 13:16:50

标签: android

我有WebView,其中我想在webview中打开属于域www.example.org的链接,而所有其他链接(如果点击)在我的应用程序之外的默认浏览器中打开。

我尝试使用public boolean shouldOverrideUrlLoading(WebView视图,String url),但它无法正常工作。

以下代码不起作用:

public class MyWebViewClient extends WebViewClient {
    @Override
               public boolean shouldOverrideUrlLoading(WebView view, String url) {
                   try {
                   URL urlObj = new URL(url);
                   if (urlObj.getHost().equals("192.168.1.34")) {
                       view.loadUrl(url);
                       return true;
                   } else {
                       view.loadUrl(url);
                       return false;
                     }
                   } catch (Exception e) {

                   }
               }
}

在这两种情况下(返回true并返回false),URL由我的应用程序处理。

3 个答案:

答案 0 :(得分:22)

创建WebViewClient并将WebView附加到WebViewClient后,您已覆盖默认行为,其中Android将允许ActivityManager将URL传递给浏览器(仅当未设置客户端时才会出现此情况)在视图上),请参阅the docs on the method for more

附加shouldOverrideUrlLoading()后,返回虚假表单WebView会将网址传递给WebView,而返回true会告诉@Override public boolean shouldOverrideUrlLoading(WebView view, String url) { try { URL urlObj = new URL(url); if( TextUtils.equals(urlObj.getHost(),"192.168.1.34") ) { //Allow the WebView in your application to do its thing return false; } else { //Pass it to the system, doesn't match your domain Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse(url)); startActivity(intent); //Tell the WebView you took care of it. return true; } } catch (Exception e) { e.printStackTrace(); } } 什么都不做......因为您的申请将负责处理。不幸的是,这些路径都没有让Android将URL传递给浏览器。这样的事情可以解决你的问题:

return false;

我知道这似乎有点违反直觉,因为您希望WebView完全绕过WebViewClient,但在使用自定义{{1}}后情况并非如此。

希望有所帮助!

答案 1 :(得分:5)

如果您无法解释“不能正常工作”的含义,我们就不会为您提供更多具体的帮助。

使用shouldOverrideUrlLoading()。检查提供的URL。如果您要保留WebView,请使用网址loadUrl()上的WebView,然后返回true。否则,请返回false并让Android正常处理。

答案 2 :(得分:1)

将以下内容添加到您的活动中

validate :at_least_one_of_key_or_key_position

private

def at_least_one_of_key_or_key_position
  unlsee key.present? || key_position.present?
    errors.add(:base, "at least one of key or key_position should exist")
  end
end