Android WebView和JavaScript交互

时间:2023-03-08 16:26:43

  JavaScript在现在的网页设计中用得很多,Android 的WebView可以载入网页,WebView也设计了与JavaScript通信的桥梁。这篇主要介绍一下WebViewk控件如何和JavaScript进行交互。

WebView:

  WebView和网页相关的主要有一下几个方法: 

      setWebViewClient();

      setWebChromeClient();

      addJavascriptInterface();

      loadUrl();

    setWebViewClient():设置一个WebViewClient的对象,通过这个对象的几个回调方法,可以知道当前网页的状态。

    setWebViewChromeClient(): 设置一个WebChromeClient对象,JavaScript调用的一些内建方法都是通过这个对象来处理的。

    addJavascriptInterface(): 设置JavaScript的接口,有两个参数,第一个一般是一个Object对象,里面实现的方法都是网页里JavaScript可以调用到的,第二个参数是一个字符串,最后到JavaScript就相当于一个对象名,JavaScript通过这个对象名调用第一个参数里面实现的方法。要使这个方法生效,要通过WebView的getSettings()方法获取WebSettings对象,设置JavaScript使能 setJavaScriptEnabled(true)。

    loadUrl():载入相应网页。

  下面实现了一个简单的Demo(最后有效果图): 主要的流程是载入了asset目录下的一个内置网页,点击网页上的Click按钮,会调用通过addJavascriptInterface方法设置下去的Object的show()方法,这个方法里通过loadUrl的方式调用JavaScript的javaScriptshow()方法,这个方法里又调用了Java的result()方法,result方法里显示了一个Toast.需要注意的是show()方法的回调和result()方法的回调是不在主线程的。

MainActivity.java

 package com.example.administrator.webviewl;

 import android.graphics.Bitmap;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.webkit.JavascriptInterface;
import android.webkit.JsResult;
import android.webkit.WebChromeClient;
import android.webkit.WebResourceError;
import android.webkit.WebResourceRequest;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Toast; public class MainActivity extends AppCompatActivity { private static final String TAG = "MainActivity.TAG";
WebView mWebView;
Handler mHander = new Handler();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mWebView = (WebView)findViewById(R.id.mWebView);
initWebView();
} public void initWebView() {
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.setWebViewClient(new WebViewClientCustom());
mWebView.addJavascriptInterface(new Object() {
@JavascriptInterface
public void result(final String result) {
Log.d(TAG,"javaScript 调用java的方法 返回结果 result = " + result);
mHander.post(new Runnable() {
@Override
public void run() {
if (result.length() > 0) Toast.makeText(MainActivity.this,"你输入了: " + result,Toast.LENGTH_SHORT).show();
}
});
}
@JavascriptInterface
public void show() {
Log.d(TAG,"JavaScript 调用java show()");
mHander.post(new Runnable() {
@Override
public void run() {
Log.d(TAG,"java 调用 javaScript javaScriptshow()");
mWebView.loadUrl("JavaScript:javaScriptshow()");
}
});
return;
}
},"JavaScriptL");
mWebView.loadUrl("file:///android_asset/index.html");
} public class WebViewClientCustom extends WebViewClient {
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
Log.d(TAG,"onPageStarted");
super.onPageStarted(view, url, favicon);
} @Override
public void onPageFinished(WebView view, String url) {
Log.d(TAG,"onPageFinished");
super.onPageFinished(view, url);
} @Override
public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
Log.d(TAG,"onReceivedError");
super.onReceivedError(view, request, error);
}
}
}

index.html  内置的网页

 <!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="Generator" content="EditPlus®">
<meta name="Author" content="">
<meta name="Keywords" content="">
<meta name="Description" content="">
<title>javaScript</title>
<script type="text/javaScript">
function javaScriptshow() {
var a = document.getElementById("text").value;
JavaScriptL.result(a);
}
</script>
</head>
<body style="text-align:center;margin-top:100px">
<p > Android javaScript学习</p>
<form action="">
<input type="text" id = "text" value=""/>
<input type="button" onclick="window.JavaScriptL.show()" value="Click" />
</form>
</body>
</html>

 

 实现的效果图如下:

  Android WebView和JavaScript交互