webChromeClient在浏览器中打开链接

时间:2013-02-02 17:15:13

标签: android webchromeclient

我搜索并阅读了很多帖子,但无法弄清楚如何在我的代码中执行此操作。

我想在我的应用程序中使用地理位置,需要在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);

3 个答案:

答案 0 :(得分:60)

WebChromeClient不包含webViewClient的shouldOverrideUrlLoading方法。请记住,如果指定,“WebView”可以同时使用WebViewClient和WebChromeClient。 WebViewClient添加了不可用的方法,没有分配客户端(在webview中保持导航)。与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;
    }
});

答案 1 :(得分:8)

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

mBrowser.setWebViewClient(new WebViewClient());

答案 2 :(得分:2)

要在浏览器中打开链接,您可以使用intent方法中的shouldOverrideUrlLoading在浏览器中启动网址,而不是使用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;
    }
};