java解决webview,Android高级进阶:WebView java与JavaScript交互详解

手把手教小白实现WebView中java与js的交互:

java调用js方法一:

效果图:

f9bb3b2b7d07

java调用js.png

shopping.html

Title

// Android需要调用的方法

function callJS(){

alert("Android调用了JS的callJS方法");

}

第一步:在assets目录中添加shopping.html文件。

第二步:在activity中加载WebView组件,并加载html

avtivity.java

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

WebSettings settings = webView.getSettings();

settings.setJavaScriptEnabled(true);

settings.setJavaScriptCanOpenWindowsAutomatically(true);

webView.setWebChromeClient(new WebChromeClient() {

@Override

public boolean onJsAlert(WebView view, String url, String message, JsResult result) {

new AlertDialog.Builder(view.getContext()).setTitle("提示").setMessage(message).show();

return true;

}

});

mTvBtn.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

webView.loadUrl("javascript:callJS()");

}

});

注意点:

1、通过setJavaScriptEnable(true) 让WebView支持JavaScript

2、setJavaScriptCanOpenWindowsAutomatically(true)开启弹窗

3、在Android中需要重写js的Alert(),Confirm(),Prompt(),否则会遇到无法开启弹窗的问题。

java调用js方法二:

注意:evaluateJavascript中不需要添加javascript修饰js的方法

mTvBtn.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

// webView.loadUrl("javascript:callJS()");

// todo evaluateJavascript中不需要添加javascript修饰js的方法

webView.evaluateJavascript("callJS()", new ValueCallback() {

@Override

public void onReceiveValue(String value) {

Toast.makeText(ShoppingActivity.this,value,Toast.LENGTH_LONG).show();

mTvBtn.setText(value);

}

});

}

});

差异:evaluateJavascript可以获得js的返回值,但是只支持4.4及以上Android版本

js调用java方法一:

f9bb3b2b7d07

JS调用Android代码.png

H5这边

shopping.html

Title

// Android需要调用的方法

function callJS(){

alert("Android调用了JS的callJS方法");

}

function callAndroid(){

javaObject.showToast('JS 唤起Android Toast')

}

WebView

唤起Android toast

h5中js函数内通过约定类名和方法调用java代码: javaObject.showToast('JS 唤起Android Toast')

Android这边

创建约定类:JavaObject.java

public class JavaObject {

private final Context mContext;

public JavaObject(Context context) {

mContext = context;

}

@JavascriptInterface

public void showToast(String msg) {

Toast.makeText(mContext, msg, Toast.LENGTH_LONG).show();

}

}

在activity中添加java和js的链接桥梁,name要与js中的一致

webView.addJavascriptInterface(new JavaObject(this),"javaObject");

js调用java方法二:

通过复写WebViewClient中shouldOverrideUrlLoading的方法,并约定js中的URL协议

webView.setWebViewClient(new WebViewClient(){

@Override

public boolean shouldOverrideUrlLoading(WebView view, String url) {

Uri uri = Uri.parse(url);

if ("js".equals(uri.getScheme())){

if ("webView".equals(uri.getAuthority())) {

Set params = uri.getQueryParameterNames();

}

}

return super.shouldOverrideUrlLoading(view, url);

}

});

特点:

优点:不存在方式1的漏洞;

缺点:JS获取Android方法的返回值复杂。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值