web-dev-qa-db-fra.com

Webchromeclient ouvre un lien dans le navigateur

J'ai cherché et lire beaucoup de postes mais je ne peux pas comprendre comment le faire dans mon code.

Je souhaite utiliser la géolocalisation dans mon application et avoir besoin d'afficher en webchromeclient au sujet de WebViewClient Wich i Utilisez pour les fichiers HTML maintenant et les liens restent dans la même vue.

Lorsque je change ceci en webchromeclient, les liens HTML, comme <a href="http://url/file.php?q=123", s'ouvrant soudainement dans le navigateur!

Comment puis-je empêcher cela?

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);
20
Harry

webchromeclient ne contient pas la méthode de recouvrement de la récidivité, le webviewClient. N'oubliez pas que la "View "peut utiliser et utilise à la fois WebViewClient et Webchromeclient en même temps si spécifié. Le WebViewClient ajoute des méthodes non disponibles avec aucun client attribué (remplacement de la navigation dans la vision Web). La même chose avec le Webchromeclient a des méthodes spécifiques qu'il peut utiliser (obtenir le titre de la page sur la charge par exemple).

Vous pouvez donc construire votre code comme celui-ci:

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;
    }
});
63
Chad Adams

J'ai pu contourner cela en définissant un factice WebViewClient en plus du webchromeclient. Je ne sais pas pourquoi, mais quand je prends cette ligne, la page Web commence à ouvrir à nouveau dans le navigateur.

mBrowser.setWebViewClient(new WebViewClient());
8
inky

Pour ouvrir des liens dans le navigateur, vous pouvez utiliser un intent dans la méthode shouldOverrideUrlLoading pour lancer l'URL dans un navigateur par rapport à l'utilisation de votre webview pour gérer le lien:

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;
        }
    }
}

Si vous souhaitez charger dans l'utilisation 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;
    }
};
2
Nick