在Android中的webview中调用Javascript方法

时间:2016-03-10 02:36:06

标签: javascript android html webview

我正在尝试从webview中调用html页面中定义的javascript方法。函数未被调用,我在日志中看不到任何错误。

这是html文件。

                                                        

    </head>
    <body>
    <script type="text/javascript">
        function callJS(){
            $.ajax({url:"http://10.0.2.2:5010"});
        }
    </script>
    </body>
    </html>

这是android中的Activity中的Java代码

    WebView webView = new WebView(this);
    webView.getSettings().setJavaScriptEnabled(true);
    webView.loadUrl("file:///android_asset/temp.html");
    webView.loadUrl("javascript:callJS()");

不确定如何调试此内容。当我在html的body标签中添加onload=callJS()时,我看到正在进行远程调用。所以,看起来我的HTML很好,它正被加载到webview中。但是,webview无法直接调用javascript方法。

2 个答案:

答案 0 :(得分:7)

您应该在加载页面时执行javascript函数

webView.setWebViewClient(new WebViewClient() {
    public void onPageFinished(WebView view, String url) {
        webView.loadUrl("javascript:callJS()");
    }
});

当您放置onload=callJS()表示在加载页面时将调用javascript函数。 对于调试,你可以将console.log(“你的文字在这里”)放在你的javascript函数中,你将在你的android工作室日志中得到它。 (通常使用标记I/chromium)。否则,您可以在Android上使用Chrome进行远程调试。这里的文档https://developer.chrome.com/devtools/docs/remote-debugging

答案 1 :(得分:1)

请立即尝试:

活动代码:

public class MainActivity extends AppCompatActivity {
 private WebView mWebView = null;
    private ProgressBar mLoading;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        this.mWebView = (WebView)findViewById(R.id.wvPortal);
        mLoading = (ProgressBar) findViewById(R.id.pbLoading);
        WebSettings webSettings = mWebView.getSettings();
        webSettings.setJavaScriptEnabled(true);
        webSettings.setDomStorageEnabled(true);
        webSettings.setSupportZoom(true);
        webSettings.setLoadWithOverviewMode(true);
        webSettings.setUseWideViewPort(true);
        webSettings.setSupportMultipleWindows(true);
        mWebView.getSettings().setDomStorageEnabled(true);
        mWebView.setWebChromeClient(new WebChromeClient());
       /* To keep page navigation within the WebView and hence within the app,
        we need to create a subclass of WebViewClient,and override its shouldOverrideUrlLoading(WebView webView, String url) method.*/
        WebViewClientImpl webViewClient = new WebViewClientImpl(this);
        mWebView.setWebViewClient(webViewClient);
        mWebView.loadUrl("file:///android_asset/www/index.html");
        WebSettings mWebSettings = mWebView.getSettings();
        mWebSettings.setJavaScriptEnabled(true);
        Log.d("Test 0","Interface calls");
        //calling javascript interface:
        // 1st.parameter is the JavaScript interface object itself.
        // 2nd.parameter is the name of the global JavaScript variable which the JavaScript interface object is bound to.
        mWebView.addJavascriptInterface(new AppJavaScriptProxy(this,mWebView), "androidAppProxy");

    }
}

AppJavaScriptProxy类 for creationg interface:

public class AppJavaScriptProxy {
    private Activity activity = null;
    private WebView webView  = null;
    public AppJavaScriptProxy(Activity activity,WebView webview) {
        this.activity = activity;
        this.webView  = webview;
        Log.d("Test 1","in Interface");
    }

    @JavascriptInterface
    public void showMessage(final String message) {
        Log.d("from javascript", "" + message);
        final Activity theActivity = this.activity;
        final WebView theWebView = this.webView;
        this.activity.runOnUiThread(new Runnable() {
            @Override
            public void run() {
                if (!theWebView.getUrl().startsWith("file:///android_asset/www/index.html")) {
                    return;
                }
                Toast toast = Toast.makeText(
                        theActivity.getApplicationContext(),
                        message,
                        Toast.LENGTH_SHORT);
                toast.show();
            }
        });
    }
}

Index.html 在html页面中调用此脚本。

<input type="button" value="call Methode" onClick="showMessage("Message from JavaScript")" />
<script>
    if(typeof androidAppProxy !== "undefined"){
    androidAppProxy.showMessage("Message from JavaScript");
} else {
    alert("Running outside Android app");
}
</script>

在任何按钮上单击webview索引页面调用此脚本。 参考。 Building webapps in webview

如果以上代码段可以帮助您,请投票给我答案。谢谢!