web-dev-qa-db-fra.com

JavaScript ne fonctionne pas dans la vue Web Android?

J'essaie de créer une version Android d'une application iOS relativement simple qui utilise une vue Web, des boutons, puis des appels javascript vers un CMS.

Mais je suis bloqué à un stade précoce de développement: la visualisation Web ne fonctionne pas avec javascript. J'ai lu de nombreux articles sur la façon d'activer JS dans une visualisation Web Android, mais aucune chance jusqu'à présent. 

Ci-dessous 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)");
}

Qu'est-ce que je fais mal ici? 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 ...

45
David K

CORRIGÉ! Sous l'impulsion de l'erreur, j'ai découvert que je devais définir setDomStorageEnabled(true) Pour les paramètres de la vue Web. 

Merci pour votre aide Stephan :) 

85
David K

Au cas où quelque chose avec WebView sur Android ne fonctionnerait pas, j'essaie toujours de m'assurer de régler 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 ils ne sont pas définis par défaut. Ceux qui s’attendraient à des pages Web sans contenu javascript de nos jours, et quelle utilisation aurait javascript activé lorsque DOM n’est pas disponible, sauf indication contraire. J'espère que quelqu'un l'a déjà signalé sous forme de bogue ou d'amélioration/demande de fonctionnalité et que les singes y travaillent déjà.

et puis il y a des trucs déconseillés qui pourrissent quelque part, comme ceci:

webView.getSettings().setPluginState(PluginState.ON);

Tout cela pour charger des pages Web dans 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)
}
28
computingfreak

Chargement de javascript dans la vue Web

webView.getSettings().setDomStorageEnabled(true);
5
Shivam Kumar

Avez-vous activé la bonne autorisation Internet dans le manifeste? Sinon, tout va bien. Par hasard, avez-vous également testé ce code sur un téléphone Android réel? Et pas seulement sur l'émulateur? 

Voici un bon tutoriel sur une approche légèrement différente. Vous voudrez peut-être essayer celui-là pour voir si cela fonctionne pour vous.

4
Stephan Branczyk

Cette vidéo ( http://youtu.be/uVqp1zcMfbE ) m'a donné l'indice pour que cela fonctionne . La clé est de sauvegarder vos fichiers html et js dans le dossier Android assets/ ..__ peut facilement y accéder via: 

webView.loadUrl("file:///Android_assets/your_page.html");
1
user574199

Autorisez simplement votre WebView à exécuter JS, aussi simple que cela:

WebView web=(WebView)findViewById(R.id.web);
web.getSettings().setJavaScriptEnabled(true);
0
PYK

Ajoutez les lignes de code suivantes dans votre MainActivity.Java  

Cela m'a aidé à activer js

  webSetting.setJavaScriptEnabled(true);
  webView.setWebChromeClient(new WebChromeClient());
  webView.setWebViewClient(new WebViewClient());

n'oubliez pas cette permission dans le fichier AndroidManifest.

<uses-permission Android:name="Android.permission.INTERNET" />
0
prashant kute

Pour activer les popups javascript dans WebView, il est nécessaire de définir webChromeClient et de remplacer openFileChooser .

    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érez le résultat onActivity 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;
    }

}
0
priyanka_16989