WebView中Java与JS的交互

在assets目录下新建页面js_test.html,页面中有一个按钮,被点击时调用Java方法。页面中还提供了一个JS方法共调用,该JS方法的作用是一个alert提示。
<html>
    <script language="javascript">
     <!-- Java调用JS方法 -->
       function JsCalledByJava() {
          alert("JS被调用");
       }
    </script>
    <body>
        网页内容 

       <input type="button" value="调用Java方法" onclick="window.js_tag.javaCalledByJS('Java被调用');" />
    </body>
</html>

当按钮被点击时,下面这个方法被调用,打印传进来的参数并调用JS方法JsCalledByJava
webView.addJavascriptInterface(new Object() {

			@JavascriptInterface
			public void javaCalledByJS(final String msg) {
				System.out.println(msg);
				webView.loadUrl("javascript:JsCalledByJava()");
			}
		}, "js_tag");

当JsCalledByJava被调用时,执行alert()函数。alert操作被onJsAlert回调,并用原生的AlertDialog显示提示信息
webView.setWebChromeClient(new WebChromeClient() {

			@Override
			public boolean onJsAlert(WebView view, String url, String message,
					final JsResult result) {
				new AlertDialog.Builder(MainActivity.this)
						.setTitle("JS提示")
						.setMessage(message)
						.setPositiveButton(android.R.string.ok,
								new AlertDialog.OnClickListener() {
									public void onClick(DialogInterface dialog,
											int which) {
										result.confirm();
									}
								}).setCancelable(false).create().show();
				return true;
			}
		});


完整的Activity如下:
public class MainActivity extends Activity {

	private WebView webView;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		webView = (WebView) findViewById(R.id.webview);
		WebSettings settings = webView.getSettings();
		settings.setJavaScriptEnabled(true);

		webView.addJavascriptInterface(new Object() {

			@JavascriptInterface
			public void javaCalledByJS(final String msg) {
				System.out.println(msg);
				webView.loadUrl("javascript:JsCalledByJava()");
			}
		}, "js_tag");

		webView.setWebViewClient(new WebViewClient() {

			@Override
			public boolean shouldOverrideUrlLoading(WebView view, String url) {
				super.shouldOverrideUrlLoading(view, url);
				view.loadUrl(url);
				return true;
			}
		});

		webView.setWebChromeClient(new WebChromeClient() {

			@Override
			public boolean onJsAlert(WebView view, String url, String message,
					final JsResult result) {
				new AlertDialog.Builder(MainActivity.this)
						.setTitle("JS提示")
						.setMessage(message)
						.setPositiveButton(android.R.string.ok,
								new AlertDialog.OnClickListener() {
									public void onClick(DialogInterface dialog,
											int which) {
										result.confirm();
									}
								}).setCancelable(false).create().show();
				return true;
			}
		});

		webView.loadUrl("file:///android_asset/js_test.html");
	}

	@Override
	public boolean onKeyDown(int keyCode, KeyEvent event) {
		if (keyCode == KeyEvent.KEYCODE_BACK) {
			if (webView.canGoBack()) {
				webView.goBack();
			} else {
				finish();
			}
			return true;
		}
		return super.onKeyDown(keyCode, event);
	}

	@Override
	protected void onDestroy() {
		super.onDestroy();
		if (webView != null) {
			webView.clearCache(true);
		}
	}

}

猜你喜欢

转载自hu555u.iteye.com/blog/2087585