参考博客
https://blog.youkuaiyun.com/u014712086/article/details/78629890
https://blog.youkuaiyun.com/rookie_small/article/details/68488335
1、加载四种方式
//方式1. 加载一个网页:
webView.loadUrl("http://www.google.com/");
//方式2:加载apk包中的html页面
webView.loadUrl("file:///android_asset/test.html");
//方式3:加载手机本地的html页面
webView.loadUrl("content://com.android.htmlfileprovider/sdcard/test.html");
”file:///mnt/sdcard/FMDemoBaseMap/FMMap.html“或者是这个地址
// 方式4: 加载 HTML 页面的一小段内容
WebView.loadData(String data, String mimeType, String encoding)
说一下第三个和第四个方式
第三个方式需要注意1、该APP要添加本地读写权限;2、如果按第一个写的话,需要重写provider;第三个可以直接加载
2、js与java交互的几种方式
1.javascriptInterface
java调用js
在java中:
wv_map.loadUrl("javascript:loadMap()");
在js中
<script>
function test(){
document.getElementById("d").innerHTML += " 你好!"
}
</script>
js调用java
在java中:
// 第一步,注册方法
wv_map.addJavascriptInterface(this, "Android");
// 第二步,声明方法,通过@JavascriptInterface方式
//JS需要调用的方法
@JavascriptInterface
public void showToast(String arg, String arg1) {
Toast.makeText(MainActivity.this, arg + arg1, Toast.LENGTH_SHORT).show();
}
@JavascriptInterface
public void goNext() {
Toast.makeText(MainActivity.this, "点击了", Toast.LENGTH_SHORT).show();
}
在js中:
// window.Android.goNext(), Android是java中声明的关键字,goNext是java的方法名
<input type="button" value="执行Android方法" onclick="window.Android.goNext()"/>
2、evaluateJavascript方式
/**
* 使用evaluateJavascript方法,该方法需要API>19
* 不会去刷新页面,因此效率更高
*/
@RequiresApi(api = Build.VERSION_CODES.KITKAT)
public void callJSByEvaluate(FMViewMode mode){
final int mode1 = mode.getMode();
// 只需要将第一种方法的loadUrl()换成下面该方法即可
this.evaluateJavascript(JSMethodHead+"setMapViewMode("+mode1+")", new ValueCallback<String>() {
@Override
public void onReceiveValue(String value) {
//此处为 js 返回的结果
Toast.makeText(mContext, value, Toast.LENGTH_SHORT).show();
// Log.d("evaluateJS", value);
}
});
}
3、拦截方式
1.webViewClient.shouldOverrideUrlLoading()
/**
* 在webview界面内点击跳转时触发,加载webview不会触发
*/
class MyWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
Log.d("url", url);
view.loadUrl(url);
return true;
}
}
2.webChromeClient.onconsoleMessage()
class MyWebChromeClient extends WebChromeClient {
@Override
public boolean onConsoleMessage(ConsoleMessage consoleMessage) {
// 监听console打印
Log.d("console","linenumber:"+consoleMessage.lineNumber()
+";message:"+consoleMessage.message()
+";level:"+consoleMessage.messageLevel());
return true;
}
}
3.webChromeClient.onJspompt()
class MyWebChromeClient extends WebChromeClient {
@Override
public boolean onJsConfirm(WebView view, String url, String message, JsResult result) {
// 确认消息框
return true;
}
}
4、webChromeClient.onJsAlert()
@Override
public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
// 监听js的alert打印 警告消息框,如果这里返回true,那么会卡死到这里
Log.d("alert", url + message + result.toString());
return super.onJsAlert(view,url,message,result);
}