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 ...
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 :)
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)
}
Chargement de javascript dans la vue Web
webView.getSettings().setDomStorageEnabled(true);
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.
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");
Autorisez simplement votre WebView à exécuter JS, aussi simple que cela:
WebView web=(WebView)findViewById(R.id.web);
web.getSettings().setJavaScriptEnabled(true);
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" />
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;
}
}