Lors de la recherche d'une réponse dans Google, il semble que je ne suis pas le seul à être confronté à un problème qui semble impossible à résoudre.
J'ai réussi à créer une WebView avec un WebViewClient personnalisé - cela me permet d'avoir un dialogue de processus et d'afficher un message d'erreur si une URL n'a pas pu être chargée.
Mais cela crée un problème avec JavaScript. L'URL que je charge contient du JavaScript qui modifie certains styles CSS des éléments HTML (affichage ou masquage de l'élément) ou redirige vers un autre emplacement en cliquant - ou peut-être même souhaite afficher une boîte d'alerte. Mais en utilisant WebViewClient, rien de tout cela ne fonctionne.
Voici comment je charge une page:
public void loadUrl(String url)
{
final ProgressDialog dialog = ProgressDialog.show(myActivity.this, "", getString(R.string.loading), true);
final WebView myWebView = (WebView) findViewById(R.id.webview);
myWebView.setVerticalScrollBarEnabled(false);
myWebView.setHorizontalScrollBarEnabled(false);
WebSettings webSettings = myWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
myWebView.setWebViewClient(new WebViewClient()
{
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url)
{
Toast.makeText(myActivity.this, url, Toast.LENGTH_SHORT).show(); //Debugging purposes
if (url.endsWith(".mp4"))
{
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.parse(url), "video/mp4");
view.getContext().startActivity(intent);
}
else
{
view.loadUrl(url);
}
return true;
}
public void onPageFinished(WebView view, String url)
{
//Toast.makeText(myActivity.this, "Oh no!", Toast.LENGTH_SHORT).show();
dialog.dismiss();
}
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl)
{
Toast.makeText(myActivity.this, description, Toast.LENGTH_SHORT).show();
String summary = "<html><body><strong>" + getString(R.string.lost_connection) + "</body></html>";
myWebView.loadData(summary, "text/html", "utf-8");
}
}); //End WebViewClient
myWebView.loadUrl(url);
}
Cela pourrait probablement être fait de manière plus intelligente, mais je suis nouveau à la fois Java et Android ...
Est-il possible pour moi d'activer le JavaScript pour WebViewClient? La suppression du WebViewClient résout le problème, mais je ne parviens pas à intercepter les événements lorsque la page se trompe ou se termine.
Je ne sais pas quel est votre problème exact, mais je peux activer le JavaScript et un WebViewclient
personnalisé sans aucun problème:
WebView vistaWeb = (WebView) findViewById(R.id.webview);
vistaWeb.setWebChromeClient(new MyCustomChromeClient(this));
vistaWeb.setWebViewClient(new MyCustomWebViewClient(this));
vistaWeb.clearCache(true);
vistaWeb.clearHistory();
vistaWeb.getSettings().setJavaScriptEnabled(true);
vistaWeb.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
La bonne façon d'activer JavaScript consiste à ajouter les deux lignes ci-dessous:
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
Même si après avoir ajouté son ne fonctionne pas, essayez d'ajouter la ligne ci-dessous.
mWebView.getSettings().setDomStorageEnabled(true);
Maintenant ça devrait marcher. :)
Essayez ceci pour activer javascript
WebView myWebView = (WebView) findViewById(R.id.webView);
myWebView.getSettings().setJavaScriptEnabled(true);
myWebView.setWebViewClient(new WebViewClient());
myWebView.loadUrl(url);
Les "URL Javascript" sont-elles acheminées via shouldOverrideUrlLoading
? Essayez de vérifier cela et si c'est le cas, renvoyez false
pour des liens comme celui-ci (afin que la vue Web gère le lien, pas votre WebViewClient)
Qu'est-il arrivé dans mon cas: je servais des fichiers html locaux et lors de l'application
web.getSettings().setJavaScriptEnabled(true);
web.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
mais mes URL ont cessé de fonctionner. La solution pour faire fonctionner JS et href local était d'ajouter
web.getSettings().setAllowFileAccess(true);
web.getSettings().setAllowFileAccessFromFileURLs(true);
où
web = (WebView) findViewById(R.id.embedded_web);
Similaire à la réponse @mdelolmo, mais dans Kotlin:
webview.setWebChromeClient(WebChromeClient())
webview.setWebViewClient(WebViewClient())
webview.clearCache(true)
webview.clearHistory()
webview.getSettings().setJavaScriptEnabled(true)
webview.getSettings().setJavaScriptCanOpenWindowsAutomatically(true)