android与web互调,Android WebView和html中js互调

希望大写一起学习android,一起进步。可以加群 102063643 android技术开发

在做应用的过程中,越来越多的应用使用webView来显示界面了,其中很多和js交互的地方。

写了一个Demo,大家来看一下效果图和项目结构

22c80c4249c85216dfc9f461ff8d368e.png

d9a1b748cc9071d9a4a87a60aa95cb8f.png

index.html的代码如下

?

JS交互

function invokedByJava(param) {

document.getElementById("content").innerHTML = "Java has invoked JS function and returnd the data:"+param;

}

这个是MainActivity的代码

public class MainActivity extends Activity {

private WebView mWebView;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

findViewById(R.id.changButton).setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

//调用JS方法,并传递参数

mWebView.loadUrl("javascript:invokedByJava('Hello World')");

}

});

mWebView = (WebView)findViewById(R.id.webView);

mWebView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);

mWebView.getSettings().setBuiltInZoomControls(true);

mWebView.getSettings().setJavaScriptEnabled(true);

/*

WebView默认用系统自带浏览器处理页面跳转。

为了让页面跳转在当前WebView中进行,重写WebViewClient。

但是按BACK键时,不会返回跳转前的页面,而是退出本Activity。重写onKeyDown()方法来解决此问题。

*/

mWebView.setWebViewClient(new WebViewClient() {

@Override

public boolean shouldOverrideUrlLoading(WebView view, String url) {

view.loadUrl(url);//使用当前WebView处理跳转

return true;//true表示此事件在此处被处理,不需要再广播

}

@Override

public void onPageStarted(WebView view, String url, Bitmap favicon) {

//有页面跳转时被回调

}

@Override

public void onPageFinished(WebView view, String url) {

//页面跳转结束后被回调

}

@Override

public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {

Toast.makeText(MainActivity.this, "Oh no! " + description, Toast.LENGTH_SHORT).show();

}

});

/*

当WebView内容影响UI时调用WebChromeClient的方法

*/

mWebView.setWebChromeClient(new WebChromeClient() {

/**

* 处理JavaScript Alert事件

*/

@Override

public boolean onJsAlert(WebView view, String url,

String message, final JsResult result) {

//用Android组件替换

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;

}

});

/*

绑定Java对象到WebView,这样可以让JS与Java通信(JS访问Java方法)

第一个参数是自定义类对象,映射成JS对象

第二个参数是第一个参数的JS别名

调用示例:

mWebView.loadUrl("javascript:window.stub.jsMethod('param')");

*/

mWebView.addJavascriptInterface(new JsToJava(), "stub");

final EditText mEditText = (EditText)findViewById(R.id.urlEditText);

findViewById(R.id.web_view_search).setOnClickListener(new OnClickListener() {

@Override

public void onClick(View view) {

String url = mEditText.getText().toString();

if (url == null || "".equals(url)) {

Toast.makeText(MainActivity.this, "请输入URL", Toast.LENGTH_SHORT).show();

} else {

if (!url.startsWith("http:") && !url.startsWith("file:")) {

url = "http://" + url;

}

mWebView.loadUrl(url);

}

}

});

//默认页面

mWebView.loadUrl("file:///android_asset/index.html");

}

@Override

public boolean onKeyDown(int keyCode, KeyEvent event) {

//处理WebView跳转返回

if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) {

mWebView.goBack();

return true;

}

return super.onKeyDown(keyCode, event);

}

private class JsToJava {

@JavascriptInterface

public void jsMethod(String paramFromJS) {

Log.i("CDH", paramFromJS);

}

}

}

点击调用JS改变页面内容

ab4cf00954a1a70ef113d867a00a0821.png

点击“调用alert”按钮,在Android中捕获JS alert,并用Android组件(AlertDialog)替换

3196d450d77fa2dd47aa284f39e4c4f4.png

点击“调用java方法”按钮,在JS中调用并传递参数到Java中的方法

ea6ec226c424190318a9053c7ace53de.png

最后点击输入网址打开网页

f3e8f08f49e9ba3a86264baa04168c8b.png

原文:http://blog.csdn.net/xu_song/article/details/44622949

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值