JavaScript ne fonctionne pas dans Android Webview?
j'essaie de faire une version Android d'une application iOS relativement simple qui utilise un webview, quelques boutons et puis s'appuie sur les appels javascript à un CMS.
mais je suis coincé à un stade assez précoce du développement: le webview ne fonctionne pas avec javascript.J'ai lu beaucoup de messages sur la façon d'activer JS dans une webview Android, mais pas de chance jusqu'à présent.
ci-Dessous est une partie de mon code:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mWebView = (WebView) findViewById(R.id.webview);
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.setWebChromeClient(new WebChromeClient());
mWebView.setWebViewClient(new HelloWebViewClient()
{
@Override
public void onPageFinished(WebView view, String url)
{
//Calling an init method that tells the website, we're ready
mWebView.loadUrl("javascript:m2Init()");
page1(mWebView);
}
});
mWebView.loadUrl("http://my_url/mobile/iphone//app.php");
}
private class HelloWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) {
mWebView.goBack();
return true;
}
return super.onKeyDown(keyCode, event);
}
public void page11(View view)
{
mWebView.loadUrl("javascript:m2LoadPage(1)");
}
Ce que je fais mal? L'URL fonctionne parfaitement dans mon application iOS, et dans un navigateur. Mais pas dans mon application!
s'il vous Plaît dites-moi que c'est quelque chose d'évident...
7 réponses
corrigé!
Stimulé par l'erreur, j'ai découvert que j'avais besoin de définir setDomStorageEnabled(true)
pour les paramètres webview.
Merci pour votre aide Stephan :)
dans le cas où quelque chose avec WebView sur Android ne fonctionne pas, j'essaie toujours de m'assurer que je mets ces drapeaux fous tels que,
WebSettings webSettings = webView.getSettings();
webSettings.setJavaScriptEnabled(true);
webSettings.setDomStorageEnabled(true);
webSettings.setLoadWithOverviewMode(true);
webSettings.setUseWideViewPort(true);
webSettings.setBuiltInZoomControls(true);
webSettings.setDisplayZoomControls(false);
webSettings.setSupportZoom(true);
webSettings.setDefaultTextEncodingName("utf-8");
je me demande pourquoi ceux-ci ne sont pas définis par défaut, qui s'attendrait à des pages Web sans contenu javascript de nos jours, et quelle est l'utilisation ayant javascript activé lorsque DOM n'est pas disponible à moins d'être spécifié. J'espère que quelqu'un a déjà déposé cette requête en tant que bug ou amélioration/fonctionnalité et que les singes y travaillent.
et puis il est obsolète des trucs de pourrir quelque part, comme ceci:
webView.getSettings().setPluginState(PluginState.ON);
tout cela pour charger des pages web à l'intérieur de l'application.
Sur iOS, tout est si simple - Swift 3.0
private func openURLWithInAppBrowser(urlString:String) {
guard let url = URL(string:urlString) else {
return
}
let sfSafari = SFSafariViewController(url:url)
present(sfSafari, animated: true, completion: nil)
}
avez-vous Permis la bonne permission internet dans le manifeste? Tout semble parfait contraire. Par hasard, avez vous aussi testé ce code sur un téléphone Android? Et pas seulement sur l'émulateur?
Voici un bon tuto sur une approche légèrement différente. Vous pouvez essayer ce pour voir si cela fonctionne pour vous.
Cette vidéo (http://youtu.be/uVqp1zcMfbE) m'a donné l'astuce pour le faire fonctionner.
L'essentiel est de sauver votre html
et js
fichiers dans l'Android assets/
dossier.
Ensuite, vous pouvez facilement y accéder via:
webView.loadUrl("file:///android_assets/your_page.html");
Chargement javascript dans webview
webView.getSettings().setDomStorageEnabled(true);
permis WebView exécuter JS, simple comme ça:
WebView web=(WebView)findViewById(R.id.web);
web.getSettings().setJavaScriptEnabled(true);
pour activer les popups javascript dans WebView il est nécessaire de définir webChromeClient et remplacer openFileChooser méthodes.
mWebview.setWebChromeClient(new WebChromeClient(){
// For Android 4.1+
@SuppressWarnings("unused")
public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) {
mUploadMessage = uploadMsg;
Intent i = new Intent(Intent.ACTION_GET_CONTENT);
i.addCategory(Intent.CATEGORY_OPENABLE);
i.setType(acceptType);
startActivityForResult(Intent.createChooser(i, "SELECT"), 100);
}
// For Android 5.0+
@SuppressLint("NewApi")
public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams) {
if (mUploadMessageArr != null) {
mUploadMessageArr.onReceiveValue(null);
mUploadMessageArr = null;
}
mUploadMessageArr = filePathCallback;
Intent intent = fileChooserParams.createIntent();
try {
startActivityForResult(intent, 101);
} catch (ActivityNotFoundException e) {
mUploadMessageArr = null;
Toast.makeText(activity,"Some error occurred.", Toast.LENGTH_LONG).show();
return false;
}
return true;
}
});
Et gérer les onActivityResult comme ci-dessous:
@SuppressLint("NewApi")
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == 100) {
if (mUploadMessage == null) return;
Uri result = data == null || resultCode != Activity.RESULT_OK ? null : data.getData();
mUploadMessage.onReceiveValue(result);
mUploadMessage = null;
}
else if (requestCode == 101) {
if (mUploadMessageArr == null) return;
mUploadMessageArr.onReceiveValue(WebChromeClient.FileChooserParams.parseResult(resultCode, data));
mUploadMessageArr = null;
}
}