【问题标题】:Clicking URLs opens default browser单击 URL 会打开默认浏览器
【发布时间】:2011-01-23 15:24:48
【问题描述】:

我在WebView 中加载了一个外部 URL。现在我需要的是,当用户单击加载页面上的链接时,它必须像普通浏览器一样工作,并以相同的WebView 打开链接。但它正在打开默认浏览器并在那里加载页面?

我已启用 JavaScript。但它仍然无法正常工作。我是不是忘记了什么?

【问题讨论】:

    标签: android url android-webview android-websettings


    【解决方案1】:

    如果您使用的是 WebView,如果您不想使用默认的 Android 行为,则必须自己拦截点击。

    您可以使用WebViewClient 监控WebView 中的事件。你想要的方法是shouldOverrideUrlLoading()。这允许您在选择特定 URL 时执行自己的操作。

    您使用setWebViewClient() method 设置WebViewWebViewClient

    如果您查看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!
          猜你喜欢
          • 1970-01-01
          • 2014-12-06
          • 1970-01-01
          • 2020-05-06
          • 1970-01-01
          • 1970-01-01
          • 2011-05-12
          • 2017-10-03
          相关资源
          最近更新 更多