【问题标题】:webChromeClient opens link in browserwebChromeClient 在浏览器中打开链接
【发布时间】:2013-02-02 17:15:13
【问题描述】:

我已经搜索并阅读了很多帖子,但无法在我的代码中弄清楚如何做到这一点。

我想在我的应用程序中使用地理定位,并且需要在 webChromeClient 中查看,而不是我现在用于 html 文件的 webViewClient,并且链接确实保持在同一个视图中。

当我将其更改为 webChromeClient 时,HTML 链接,如 <a href="http://url/file.php?q=123",突然在浏览器中打开!

如何防止这种情况发生?

myWebView = new WebView(this);  
myWebView.getSettings().setJavaScriptEnabled(true);   
myWebView.getSettings().setLoadWithOverviewMode(true);
myWebView.getSettings().setUseWideViewPort(true);
myWebView.getSettings().setGeolocationEnabled(true);
myWebView.setWebChromeClient(new WebChromeClient() {
public void onGeolocationPermissionsShowPrompt(String origin, android.webkit.GeolocationPermissions.Callback callback) { 
        callback.invoke(origin, true, false); }
});
myWebView.loadUrl("file:///android_asset/HTML/index.html");
setContentView(myWebView);

【问题讨论】:

    标签: android webchromeclient


    【解决方案1】:

    WebChromeClient 不包含 shouldOverrideUrlLoading 方法,WebViewClient 包含。请记住,如果指定,“WebView”可以并且确实同时使用 WebViewClient 和 WebChromeClient。 WebViewClient 添加了对您不可用的方法,没有分配客户端(在 web 视图中保持导航)。与 WebChromeClient 相同,它具有可以使用的特定方法(例如在加载时获取页面标题)。

    所以你可以像这样构建你的代码:

    WebView web = (WebView)findViewById(R.id.web);
    WebSettings webSettings = web.getSettings();
    webSettings.setJavaScriptEnabled(true);
    webSettings.setGeolocationEnabled(true);
    webSettings.setSupportMultipleWindows(true); // This forces ChromeClient enabled.    
    
    web.setWebChromeClient(new WebChromeClient(){
        @Override
        public void onReceivedTitle(WebView view, String title) {
             getWindow().setTitle(title); //Set Activity tile to page title.
        }
    });
    
    web.setWebViewClient(new WebViewClient() {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            view.loadUrl(url);
            return false;
        }
    });
    

    【讨论】:

    • 确实解决了我的问题。我假设(我猜很多其他开发人员)我们应该设置 WebChromeClient 或 WebViewClient,但不能同时设置。
    • 这对我有帮助,我在想@Bugdr0id 所说的
    • 解决了我的问题。在此之前,我尝试过developer.android.com/guide/webapps/webview.html,但浏览器仍然闪退。
    • 经过大量搜索,找到了这个答案,并且有效。谢谢
    • 我花了很长时间才发现可以将WebViewClientWebChromeClient 都设置为Webview。谢谢,我的活动中的 URL 处理现在终于可以正常工作了。
    【解决方案2】:

    除了 WebChromeClient 之外,我还可以通过设置一个虚拟 WebViewClient 来解决这个问题。不知道为什么,但是当我删除这条线时,网页又开始在浏览器中打开了。

    mBrowser.setWebViewClient(new WebViewClient());
    

    【讨论】:

      【解决方案3】:

      要在浏览器中打开链接,您可以在 shouldOverrideUrlLoading 方法中使用 intent 在浏览器中启动 URL,而不是使用 webview 处理链接:

      webView.setWebViewClient(new WebViewClient(){
          public boolean shouldOverrideUrlLoading(WebView view, String url) {
              if (url != null && url.startsWith("http://")) {
                  view.getContext().startActivity(
                      new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
                  return true;
              } else {
                  return false;
              }
          }
      }
      

      如果您想在 webview 中加载,请使用:

      WebViewClient yourWebClient = new WebViewClient()
      {
         // Override page so it's load on my view only
         @Override
         public boolean shouldOverrideUrlLoading(WebView  view, String  url)
         {
               // This line we let me load only pages with an anchor tag
               if ( url.contains("url") == true )
                 //Load new URL Don't override URL Link
              return false;
      
         // Return true to override url loading (In this case do nothing).
         return true;
          }
      };
      

      【讨论】:

      • 对不起,事实恰恰相反。我想要链接,例如 url/file.php?q=123" 在 webChromeClient 中停留/执行,而不是打开浏览器...
      • 感谢您尝试帮助尼克,但我失去了您...您正在为 WebViewClient 编码,而我正在询问 WebChromeClient...
      猜你喜欢
      • 2012-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-02
      相关资源
      最近更新 更多