wake-up-neo.net

JavaScript funktioniert nicht in Android Webview?

Ich versuche, eine Android-Version einer relativ einfachen iOS-App zu erstellen, die eine Webansicht, einige Schaltflächen und dann Javascript-Aufrufe an ein CMS verwendet.

Aber ich stehe noch in einer ziemlich frühen Phase der Entwicklung: Der Webview funktioniert nicht mit Javascript. Ich habe viele Beiträge darüber gelesen, wie man JS in einem Android-Webview aktiviert, 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 perfekt in meiner iOS-App und in einem Browser. Aber nicht in meiner App! 

Bitte sag mir, dass es etwas offensichtliches ist ...

45
David K

BEHOBEN! Angeregt durch den Fehler fand ich heraus, dass ich setDomStorageEnabled(true) Für die Webview-Einstellungen festlegen musste. 

Danke für deine Hilfe, Stephan :) 

85
David K

Falls etwas mit WebView auf Android nicht funktioniert, versuche ich immer, diese verrückten Flags wie

    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 von Default festgelegt werden, wer würde Webseiten heutzutage ohne Javascript erwarten, und was ist die Verwendung von Javascript, wenn DOM nicht verfügbar ist, sofern nicht anders angegeben. Hoffe, jemand hat dies bereits als Fehler oder Verbesserung/Feature-Request eingereicht und die Affen arbeiten daran.

und dann gibt es veraltete Sachen, die irgendwo verrotten:

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

All dies zum Laden von Webseiten in der 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)
}
28
computingfreak

Javascript wird in Webview geladen

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

Haben Sie im Manifest die richtige Internet-Berechtigung aktiviert? Ansonsten sieht alles gut aus. Haben Sie diesen Code möglicherweise auch auf einem Android-Handy getestet? Und nicht nur am Emulator? 

Hier ist ein gutes Tutorial mit einem etwas anderen Ansatz. Vielleicht möchten Sie es ausprobieren, um zu sehen, ob es für Sie funktioniert.

4

Dieses Video ( http://youtu.be/uVqp1zcMfbE ) gab mir den Hinweis, damit es funktioniert .. Der Schlüssel ist, Ihre html- und js-Dateien im Android-assets/-Ordner ..__ abzuspeichern kann leicht über sie erreicht werden: 

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

Erlaube einfach deinem WebView , JS auszuführen, ganz einfach so:

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

Wenn Sie in Kotlin sind, können Sie diese Methoden 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 (dazu gehören HTML, Javascript und andere erforderliche Dateien).

Prost.

0
ralphgabb

Füge die folgenden Codezeilen in deine MainActivity.Java ein  

Es half mir, js zu aktivieren

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

vergessen Sie nicht diese Berechtigung in der AndroidManifest-Datei.

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

Um Javascript-Popups in WebView zu aktivieren, müssen Sie webChromeClient festlegen und openFileChooser ü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;
        }
    });

Und das onActivityResult wie folgt behandeln:

@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