Ich versuche, eine Android-Version einer relativ einfachen iOS-App zu erstellen, die eine Webansicht und einige Schaltflächen verwendet und sich dann auf Javascript-Aufrufe an ein CMS stützt.
Aber ich stecke an einem ziemlich frühen Punkt der Entwicklung fest: Die Webansicht funktioniert nicht mit Javascript. Ich habe viele Beiträge darüber gelesen, wie JS in einer Android-Webansicht aktiviert werden kann, aber bisher kein Glück.
Unten ist ein Teil meines Codes:
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)");
}
Was mache ich hier falsch? Die URL funktioniert in meiner iOS-App und in einem Browser einwandfrei. Aber nicht in meiner App!
Bitte sag mir, dass es etwas Offensichtliches ist ...
javascript
android
webview
David K.
quelle
quelle
Antworten:
FEST! Angespornt durch den Fehler fand ich heraus, dass ich einstellen musste
setDomStorageEnabled(true)
für die Webview-Einstellungen.
Danke für deine Hilfe Stephan :)
quelle
mWebView.getSettings().setDomStorageEnabled(true);
da dumm habe ich es zuerst versuchtmWebView.setDomStorageEnabled(true);
Falls etwas mit WebView unter Android nicht funktioniert, versuche ich immer sicherzustellen, dass ich diese verrückten Flags setze, wie z.
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");
Ich frage mich, warum diese nicht standardmäßig festgelegt sind, die heutzutage Webseiten ohne Javascript-Inhalt erwarten würden, und was die Verwendung von Javascript bedeutet, wenn DOM nicht verfügbar ist, sofern nicht anders angegeben. Hoffe, jemand hat dies bereits als Fehler oder Verbesserungs- / Feature-Anfrage eingereicht und die Affen arbeiten daran.
und dann verrottet irgendwo veraltetes Zeug wie dieses:
All dies zum Laden von Webseiten in die App.
Unter iOS ist alles so einfach - 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) }
quelle
Laden von Javascript in der Webansicht
webView.getSettings().setDomStorageEnabled(true);
quelle
Haben Sie die richtige Internetberechtigung im Manifest aktiviert? Ansonsten sieht alles gut aus. Haben Sie diesen Code zufällig auch auf einem tatsächlichen Android-Handy getestet? Und das nicht nur auf dem Emulator?
Hier ist ein gutes Tutorial zu einem etwas anderen Ansatz. Vielleicht möchten Sie es versuchen, um zu sehen, ob es für Sie funktioniert.
quelle
Fügen Sie die folgenden Codezeilen in Ihre Datei MainActivity.java ein
Es hat mir geholfen, js zu aktivieren
webSetting.setJavaScriptEnabled(true); webView.setWebChromeClient(new WebChromeClient()); webView.setWebViewClient(new WebViewClient());
Vergessen Sie diese Berechtigung in der AndroidManifest-Datei nicht.
<uses-permission Android:name="Android.permission.INTERNET" />
quelle
Dieses Video ( http://youtu.be/uVqp1zcMfbE ) gab mir den Hinweis, damit es funktioniert. Der Schlüssel ist, Ihre
html
undjs
Dateien im Android-assets/
Ordner zu speichern . Dann können Sie einfach darauf zugreifen über:webView.loadUrl("file:///android_asset/your_page.html");
quelle
Hauptsächlich reichen diese drei Zeilen aus, damit Javascipt in webView funktioniert ...
webSetting.setJavaScriptEnabled(true); webView.setWebChromeClient(new WebChromeClient()); webView.setWebViewClient(new WebViewClient());
Wenn es danach auch nicht funktioniert, fügen Sie auch die folgende Zeile hinzu.
webSettings.setDomStorageEnabled(true);
Tatsächlich benötigen Sie sowohl setJavaScriptEnabled () als auch setWebChromeClient (neuer WebChromeClient ()), damit JavaScript funktioniert. Wenn Sie nur webSetting.setJavaScriptEnabled (true) verwenden; dann wird es nicht funktionieren.
quelle
Wenn Sie sich in Kotlin befinden , können Sie die folgende Methode verwenden, um das JavaScript zum Laufen zu bringen:
webView.apply { loadUrl( "file:///android_asset/frm/my_html_landing_page_here.html" ) settings.javaScriptEnabled = true settings.domStorageEnabled = true }
Stellen Sie außerdem sicher, dass sich Ihr gesamter Ordner im Ordner "Assets" befindet (einschließlich HTML, Javascript und anderer erforderlicher Dateien).
quelle
Xamarin Android hat auch das gleiche Problem, dass WebView kein Javascript ausführt. Folgen Sie der Antwort von @computingfreak:
this.SetContentView(Resource.Layout.activity_main); var webView = this.FindViewById<WebView>(Resource.Id.webView); var webSettings = webView.Settings; webSettings.JavaScriptEnabled = true; webSettings.DomStorageEnabled = true; webSettings.LoadWithOverviewMode = true; webSettings.UseWideViewPort = true; webSettings.BuiltInZoomControls = true; webSettings.DisplayZoomControls = false; webSettings.SetSupportZoom(true); webSettings.DefaultTextEncodingName = "utf-8";
Seltsamerweise haben sie alle Setter-Methoden in Eigenschaften geändert, außer
SetSupportZoom
undSupportZoom
bleiben als Getter: /quelle
Erlauben Sie Ihrem WebView einfach, JS auszuführen, ganz einfach:
WebView web=(WebView)findViewById(R.id.web); web.getSettings().setJavaScriptEnabled(true);
quelle
Um Javascript-Popups in WebView zu aktivieren, müssen Sie webChromeClient festlegen und openFileChooser- Methoden überschreiben .
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; } });
Behandeln Sie das onActivityResult wie folgt:
@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; } }
quelle
Wenn nichts weiter oben geholfen hat, versuchen Sie, eine Verzögerung im WebViewClient.onPageFinished-Listener hinzuzufügen
override fun onPageFinished(view: WebView?, url: String?) { Handler().postDelayed({ //update your view with js here super.onPageFinished(view, url) }, 1000) }
quelle